diff --git a/ee/api/feature_flag_role_access.py b/ee/api/feature_flag_role_access.py index 6d03c7a4f361c..01aa98a05b9db 100644 --- a/ee/api/feature_flag_role_access.py +++ b/ee/api/feature_flag_role_access.py @@ -1,10 +1,10 @@ from rest_framework import exceptions, mixins, serializers, viewsets from rest_framework.permissions import SAFE_METHODS, BasePermission -from ee.api.role import RoleSerializer +from ee.api.rbac.role import RoleSerializer from ee.models.feature_flag_role_access import FeatureFlagRoleAccess -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role from posthog.api.feature_flag import FeatureFlagSerializer from posthog.api.routing import TeamAndOrgViewSetMixin from posthog.models import FeatureFlag diff --git a/ee/api/organization_resource_access.py b/ee/api/rbac/organization_resource_access.py similarity index 92% rename from ee/api/organization_resource_access.py rename to ee/api/rbac/organization_resource_access.py index bf886566605b5..9722fc7b02eac 100644 --- a/ee/api/organization_resource_access.py +++ b/ee/api/rbac/organization_resource_access.py @@ -1,7 +1,7 @@ from rest_framework import mixins, serializers, viewsets -from ee.api.role import RolePermissions -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.api.rbac.role import RolePermissions +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.api.routing import TeamAndOrgViewSetMixin diff --git a/ee/api/role.py b/ee/api/rbac/role.py similarity index 97% rename from ee/api/role.py rename to ee/api/rbac/role.py index 96041cd0109ef..ccf8acef1f1dc 100644 --- a/ee/api/role.py +++ b/ee/api/rbac/role.py @@ -5,8 +5,8 @@ from rest_framework.permissions import SAFE_METHODS, BasePermission from ee.models.feature_flag_role_access import FeatureFlagRoleAccess -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role, RoleMembership +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role, RoleMembership from posthog.api.organization_member import OrganizationMemberSerializer from posthog.api.routing import TeamAndOrgViewSetMixin from posthog.api.shared import UserBasicSerializer diff --git a/ee/api/test/test_feature_flag.py b/ee/api/test/test_feature_flag.py index e3dd5849d607c..0bc7292f7a875 100644 --- a/ee/api/test/test_feature_flag.py +++ b/ee/api/test/test_feature_flag.py @@ -1,6 +1,6 @@ from ee.api.test.base import APILicensedTest -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role, RoleMembership +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role, RoleMembership from posthog.models.feature_flag import FeatureFlag from posthog.models.organization import OrganizationMembership diff --git a/ee/api/test/test_feature_flag_role_access.py b/ee/api/test/test_feature_flag_role_access.py index 3cd4e947d90c9..d73c1c7384493 100644 --- a/ee/api/test/test_feature_flag_role_access.py +++ b/ee/api/test/test_feature_flag_role_access.py @@ -2,8 +2,8 @@ from ee.api.test.base import APILicensedTest from ee.models.feature_flag_role_access import FeatureFlagRoleAccess -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role from posthog.models.feature_flag import FeatureFlag from posthog.models.organization import OrganizationMembership from posthog.models.user import User diff --git a/ee/api/test/test_organization_resource_access.py b/ee/api/test/test_organization_resource_access.py index 9123214a092db..98206fe519f44 100644 --- a/ee/api/test/test_organization_resource_access.py +++ b/ee/api/test/test_organization_resource_access.py @@ -2,7 +2,7 @@ from rest_framework import status from ee.api.test.base import APILicensedTest -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.models.organization import Organization, OrganizationMembership from posthog.test.base import QueryMatchingTest, snapshot_postgres_queries, FuzzyInt diff --git a/ee/api/test/test_role.py b/ee/api/test/test_role.py index 1a3068ff4cf4f..96503162d5fe9 100644 --- a/ee/api/test/test_role.py +++ b/ee/api/test/test_role.py @@ -2,8 +2,8 @@ from rest_framework import status from ee.api.test.base import APILicensedTest -from ee.models.organization_resource_access import OrganizationResourceAccess -from ee.models.role import Role +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.role import Role from posthog.models.organization import Organization, OrganizationMembership diff --git a/ee/api/test/test_role_membership.py b/ee/api/test/test_role_membership.py index f89796d9b7c4f..c3e67cf0514d2 100644 --- a/ee/api/test/test_role_membership.py +++ b/ee/api/test/test_role_membership.py @@ -1,7 +1,7 @@ from rest_framework import status from ee.api.test.base import APILicensedTest -from ee.models.role import Role, RoleMembership +from ee.models.rbac.role import Role, RoleMembership from posthog.models.organization import Organization, OrganizationMembership from posthog.models.user import User diff --git a/ee/models/__init__.py b/ee/models/__init__.py index fd87f76bd54eb..ff5a8fe2dff40 100644 --- a/ee/models/__init__.py +++ b/ee/models/__init__.py @@ -5,7 +5,7 @@ from .hook import Hook from .license import License from .property_definition import EnterprisePropertyDefinition -from .role import Role, RoleMembership +from .rbac.role import Role, RoleMembership __all__ = [ "EnterpriseEventDefinition", diff --git a/ee/models/organization_resource_access.py b/ee/models/rbac/organization_resource_access.py similarity index 95% rename from ee/models/organization_resource_access.py rename to ee/models/rbac/organization_resource_access.py index 924b3e9db2855..de4c86d95a8bc 100644 --- a/ee/models/organization_resource_access.py +++ b/ee/models/rbac/organization_resource_access.py @@ -2,6 +2,8 @@ from posthog.models.organization import Organization +# NOTE: This will be deprecated in favour of the AccessControl model + class OrganizationResourceAccess(models.Model): class AccessLevel(models.IntegerChoices): diff --git a/ee/models/role.py b/ee/models/rbac/role.py similarity index 95% rename from ee/models/role.py rename to ee/models/rbac/role.py index f37170818dbc3..97201835adb1a 100644 --- a/ee/models/role.py +++ b/ee/models/rbac/role.py @@ -1,6 +1,6 @@ from django.db import models -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.models.utils import UUIDModel diff --git a/ee/urls.py b/ee/urls.py index f0cf168acffb0..7c722bc31852f 100644 --- a/ee/urls.py +++ b/ee/urls.py @@ -6,6 +6,7 @@ from django.urls.conf import path from ee.api import integration +from .api.rbac import organization_resource_access, role from .api import ( authentication, @@ -15,8 +16,6 @@ feature_flag_role_access, hooks, license, - organization_resource_access, - role, sentry_stats, subscription, ) @@ -49,6 +48,7 @@ def extend_api_router() -> None: "organization_role_memberships", ["organization_id", "role_id"], ) + # Start: routes to be deprecated project_feature_flags_router.register( r"role_access", feature_flag_role_access.FeatureFlagRoleAccessViewSet, @@ -61,6 +61,7 @@ def extend_api_router() -> None: "organization_resource_access", ["organization_id"], ) + # End: routes to be deprecated register_grandfathered_environment_nested_viewset(r"hooks", hooks.HookViewSet, "environment_hooks", ["team_id"]) register_grandfathered_environment_nested_viewset( r"explicit_members", diff --git a/frontend/src/lib/constants.tsx b/frontend/src/lib/constants.tsx index 3d563ed32d7da..1ba86ab79c36b 100644 --- a/frontend/src/lib/constants.tsx +++ b/frontend/src/lib/constants.tsx @@ -220,6 +220,7 @@ export const FEATURE_FLAGS = { LEGACY_ACTION_WEBHOOKS: 'legacy-action-webhooks', // owner: @mariusandra #team-cdp SESSION_REPLAY_URL_TRIGGER: 'session-replay-url-trigger', // owner: @richard-better #team-replay REPLAY_TEMPLATES: 'replay-templates', // owner: @raquelmsmith #team-replay + ROLE_BASED_ACCESS_CONTROL: 'role-based-access-control', // owner: @zach EXPERIMENTS_HOLDOUTS: 'experiments-holdouts', // owner: @jurajmajerik #team-experiments MESSAGING: 'messaging', // owner @mariusandra #team-cdp SESSION_REPLAY_URL_BLOCKLIST: 'session-replay-url-blocklist', // owner: @richard-better #team-replay diff --git a/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx b/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx index 2d8bba2f256bc..95a525987b8a2 100644 --- a/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx +++ b/frontend/src/scenes/data-warehouse/new/sourceWizardLogic.tsx @@ -6,6 +6,7 @@ import api from 'lib/api' import posthog from 'posthog-js' import { preflightLogic } from 'scenes/PreflightCheck/preflightLogic' import { Scene } from 'scenes/sceneTypes' +import { teamLogic } from 'scenes/teamLogic' import { urls } from 'scenes/urls' import { @@ -16,6 +17,7 @@ import { manualLinkSources, ManualLinkSourceType, PipelineTab, + ProductKey, SourceConfig, SourceFieldConfig, } from '~/types' @@ -731,6 +733,8 @@ export const sourceWizardLogic = kea([ ['resetTable', 'createTableSuccess'], dataWarehouseSettingsLogic, ['loadSources'], + teamLogic, + ['addProductIntent'], ], }), reducers({ @@ -1129,6 +1133,9 @@ export const sourceWizardLogic = kea([ setManualLinkingProvider: () => { actions.onNext() }, + selectConnector: () => { + actions.addProductIntent({ product_type: ProductKey.DATA_WAREHOUSE, intent_context: 'selected connector' }) + }, })), urlToAction(({ actions }) => ({ '/data-warehouse/:kind/redirect': ({ kind = '' }, searchParams) => { diff --git a/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx b/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx index 9dee4c767cc5e..ed98f0f3de14b 100644 --- a/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx +++ b/frontend/src/scenes/pipeline/hogfunctions/filters/HogFunctionFilters.tsx @@ -161,6 +161,10 @@ export function HogFunctionFilters(): JSX.Element { value: '{person.id}', label: 'Run once per person per interval', }, + { + value: '{concat(person.id, event.event)}', + label: 'Run once per person per event per interval', + }, ]} value={value?.hash ?? null} onChange={(val) => diff --git a/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx b/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx index e4f78f929def5..be47278635896 100644 --- a/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx +++ b/frontend/src/scenes/settings/user/personalAPIKeysLogic.tsx @@ -9,7 +9,7 @@ import { lemonToast } from 'lib/lemon-ui/LemonToast/LemonToast' import { urls } from 'scenes/urls' import { userLogic } from 'scenes/userLogic' -import { OrganizationBasicType, PersonalAPIKeyType, TeamBasicType } from '~/types' +import { APIScopeObject, OrganizationBasicType, PersonalAPIKeyType, TeamBasicType } from '~/types' import type { personalAPIKeysLogicType } from './personalAPIKeysLogicType' @@ -32,7 +32,7 @@ export const API_KEY_SCOPE_PRESETS = [ ] export type APIScope = { - key: string + key: APIScopeObject info?: string | JSX.Element disabledActions?: ('read' | 'write')[] disabledWhenProjectScoped?: boolean diff --git a/frontend/src/scenes/teamActivityDescriber.tsx b/frontend/src/scenes/teamActivityDescriber.tsx index 7c1a5cd22e44a..e3c4f9d27052f 100644 --- a/frontend/src/scenes/teamActivityDescriber.tsx +++ b/frontend/src/scenes/teamActivityDescriber.tsx @@ -347,6 +347,7 @@ const teamActionsMapping: Record< updated_at: () => null, uuid: () => null, live_events_token: () => null, + product_intents: () => null, } function nameAndLink(logItem?: ActivityLogItem): JSX.Element { diff --git a/frontend/src/scenes/teamLogic.tsx b/frontend/src/scenes/teamLogic.tsx index 3f6d102270525..0e6754609ca29 100644 --- a/frontend/src/scenes/teamLogic.tsx +++ b/frontend/src/scenes/teamLogic.tsx @@ -145,13 +145,14 @@ export const teamLogic = kea([ resetToken: async () => await api.update(`api/environments/${values.currentTeamId}/reset_token`, {}), addProductIntent: async ({ product_type, + intent_context, }: { product_type: ProductKey intent_context?: string | null }) => await api.update(`api/environments/${values.currentTeamId}/add_product_intent`, { product_type, - intent_context: null, + intent_context: intent_context ?? undefined, }), recordProductIntentOnboardingComplete: async ({ product_type }: { product_type: ProductKey }) => await api.update(`api/environments/${values.currentTeamId}/complete_product_onboarding`, { diff --git a/frontend/src/types.ts b/frontend/src/types.ts index 3d08ee1fb7512..eb839f5252bcd 100644 --- a/frontend/src/types.ts +++ b/frontend/src/types.ts @@ -545,6 +545,13 @@ export interface TeamType extends TeamBasicType { extra_settings?: Record modifiers?: HogQLQueryModifiers default_modifiers?: HogQLQueryModifiers + product_intents?: ProductIntentType[] +} + +export interface ProductIntentType { + product_type: string + created_at: string + onboarding_completed_at?: string } // This type would be more correct without `Partial`, but it's only used in the shared dashboard/insight @@ -3814,6 +3821,37 @@ export interface RoleMemberType { user_uuid: string } +export type APIScopeObject = + | 'action' + | 'activity_log' + | 'annotation' + | 'batch_export' + | 'cohort' + | 'dashboard' + | 'dashboard_template' + | 'early_access_feature' + | 'event_definition' + | 'experiment' + | 'export' + | 'feature_flag' + | 'group' + | 'insight' + | 'query' + | 'notebook' + | 'organization' + | 'organization_member' + | 'person' + | 'plugin' + | 'project' + | 'property_definition' + | 'session_recording' + | 'session_recording_playlist' + | 'sharing_configuration' + | 'subscription' + | 'survey' + | 'user' + | 'webhook' + export interface OrganizationResourcePermissionType { id: string resource: Resource diff --git a/hogql_parser/HogQLLexer.cpp b/hogql_parser/HogQLLexer.cpp index 6041af94e2ea0..51f7c603a8216 100644 --- a/hogql_parser/HogQLLexer.cpp +++ b/hogql_parser/HogQLLexer.cpp @@ -60,26 +60,26 @@ void hogqllexerLexerInitialize() { "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", - "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", - "ILIKE", "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", - "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", "SELECT", - "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", - "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", - "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", - "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", "A", "B", - "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", - "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "LETTER", "OCT_DIGIT", - "DEC_DIGIT", "HEX_DIGIT", "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", - "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", - "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", - "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", - "NOT_REGEX", "NULL_PROPERTY", "NULLISH", "PERCENT", "PLUS", "QUERY", - "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", + "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", + "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", + "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", + "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", + "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", + "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", + "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", + "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "LETTER", + "OCT_DIGIT", "DEC_DIGIT", "HEX_DIGIT", "ARROW", "ASTERISK", "BACKQUOTE", + "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", + "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", + "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", + "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", "NULLISH", "PERCENT", + "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", @@ -98,30 +98,30 @@ void hogqllexerLexerInitialize() { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", "'\\'", - "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", "'>='", - "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", "'<'", - "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", "'+'", - "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", "'}'", - "']'", "')'", "';'", "'/'", "'_'" + "", "", "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", + "'\\'", "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", + "'>='", "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", + "'<'", "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", + "'+'", "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", + "'}'", "']'", "')'", "';'", "'/'", "'_'" }, std::vector{ "", "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", - "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", - "ILIKE", "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", - "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", "SELECT", - "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", - "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", - "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", - "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", - "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", + "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", + "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", + "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", + "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", + "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", + "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", + "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", @@ -133,7 +133,7 @@ void hogqllexerLexerInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,0,160,1455,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2, + 4,0,162,1476,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2, 5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2, 13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2, @@ -162,111 +162,113 @@ void hogqllexerLexerInitialize() { 7,169,2,170,7,170,2,171,7,171,2,172,7,172,2,173,7,173,2,174,7,174,2,175, 7,175,2,176,7,176,2,177,7,177,2,178,7,178,2,179,7,179,2,180,7,180,2,181, 7,181,2,182,7,182,2,183,7,183,2,184,7,184,2,185,7,185,2,186,7,186,2,187, - 7,187,2,188,7,188,2,189,7,189,2,190,7,190,1,0,1,0,1,0,1,0,1,1,1,1,1,1, - 1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1, - 5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,426, - 8,6,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1, - 9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12, - 1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15, - 1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1,17, - 1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,19,1,19, - 1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1,21,1,22,1,22, - 1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23, - 1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,26, - 1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,28, - 1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,30, - 1,30,1,30,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,31,1,32,1,32, - 1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1,34,1,35,1,35, - 1,35,1,35,1,36,1,36,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37, - 1,37,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41, - 1,41,1,41,1,41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43, - 1,43,1,43,1,43,1,43,1,43,1,43,3,43,647,8,43,1,44,1,44,1,44,1,44,1,44, - 1,44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1,47, - 1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50, - 1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52, - 1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,1,55, - 1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57, - 1,57,1,57,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,59,1,60,1,60,1,60, - 1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,63, - 1,63,1,63,1,64,1,64,1,64,1,64,1,64,1,64,1,65,1,65,1,65,1,65,1,65,1,65, - 1,66,1,66,1,66,1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67, - 1,67,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69, - 1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70, - 1,71,1,71,1,71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73, - 1,73,1,73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75, - 1,75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1,77, - 1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79, - 1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,81, - 1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,83,1,83,1,83,1,83, - 1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,86,1,86, - 1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,88,1,88,1,88, - 1,88,1,89,1,89,1,89,1,89,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,90,1,90, - 1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92, - 1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94, - 1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96, - 1,96,1,97,1,97,1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99, - 1,99,1,99,1,99,1,100,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101, - 1,101,1,101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103, - 1,103,1,103,1,103,1,103,1,103,1,103,1,103,3,103,1021,8,103,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,3,104,1050,8,104,1,105,1,105,1,105,3,105,1055,8,105,1,105,1,105, - 1,105,1,105,5,105,1061,8,105,10,105,12,105,1064,9,105,1,105,1,105,1,105, - 1,105,1,105,1,105,1,105,1,105,1,105,5,105,1075,8,105,10,105,12,105,1078, - 9,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, - 5,105,1091,8,105,10,105,12,105,1094,9,105,1,105,1,105,3,105,1098,8,105, - 1,106,1,106,1,106,5,106,1103,8,106,10,106,12,106,1106,9,106,1,106,1,106, - 3,106,1110,8,106,1,106,1,106,3,106,1114,8,106,1,106,4,106,1117,8,106, - 11,106,12,106,1118,1,106,1,106,1,106,3,106,1124,8,106,1,106,1,106,3,106, - 1128,8,106,1,106,4,106,1131,8,106,11,106,12,106,1132,1,106,1,106,1,106, - 5,106,1138,8,106,10,106,12,106,1141,9,106,1,106,1,106,1,106,3,106,1146, - 8,106,1,106,4,106,1149,8,106,11,106,12,106,1150,1,106,1,106,1,106,1,106, - 1,106,3,106,1158,8,106,1,106,4,106,1161,8,106,11,106,12,106,1162,1,106, - 1,106,1,106,1,106,3,106,1169,8,106,1,106,4,106,1172,8,106,11,106,12,106, - 1173,3,106,1176,8,106,1,107,1,107,4,107,1180,8,107,11,107,12,107,1181, - 1,108,4,108,1185,8,108,11,108,12,108,1186,1,109,1,109,1,109,4,109,1192, - 8,109,11,109,12,109,1193,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1, - 110,1,110,5,110,1205,8,110,10,110,12,110,1208,9,110,1,110,1,110,1,111, - 1,111,1,112,1,112,1,113,1,113,1,114,1,114,1,115,1,115,1,116,1,116,1,117, - 1,117,1,118,1,118,1,119,1,119,1,120,1,120,1,121,1,121,1,122,1,122,1,123, - 1,123,1,124,1,124,1,125,1,125,1,126,1,126,1,127,1,127,1,128,1,128,1,129, - 1,129,1,130,1,130,1,131,1,131,1,132,1,132,1,133,1,133,1,134,1,134,1,135, - 1,135,1,136,1,136,1,137,1,137,1,138,1,138,1,139,1,139,1,140,1,140,1,141, - 1,141,1,141,1,142,1,142,1,143,1,143,1,144,1,144,1,145,1,145,1,146,1,146, - 1,147,1,147,1,147,1,148,1,148,1,149,1,149,1,150,1,150,1,151,1,151,1,151, - 1,152,1,152,1,153,1,153,1,153,1,154,1,154,1,155,1,155,1,156,1,156,1,156, - 1,157,1,157,1,157,1,157,1,158,1,158,1,158,1,158,1,159,1,159,1,160,1,160, - 1,161,1,161,1,161,1,162,1,162,1,163,1,163,1,163,1,163,3,163,1330,8,163, - 1,164,1,164,1,164,1,164,1,165,1,165,1,165,1,166,1,166,1,166,1,167,1,167, - 1,167,1,168,1,168,1,169,1,169,1,170,1,170,1,171,1,171,1,172,1,172,1,172, - 1,172,1,172,1,173,1,173,1,173,1,173,1,173,1,174,1,174,1,175,1,175,1,176, - 1,176,1,176,1,177,1,177,1,177,1,177,1,178,1,178,1,179,1,179,1,180,1,180, - 1,181,1,181,1,182,1,182,1,183,1,183,1,183,1,183,5,183,1388,8,183,10,183, - 12,183,1391,9,183,1,183,1,183,1,183,1,183,1,183,1,184,1,184,1,184,1,184, - 3,184,1402,8,184,1,184,5,184,1405,8,184,10,184,12,184,1408,9,184,1,184, - 3,184,1411,8,184,1,184,1,184,1,185,1,185,1,185,1,185,1,186,1,186,1,186, - 1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,4,186,1430,8,186,11,186, - 12,186,1431,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188,1,189, - 1,189,1,189,1,189,1,189,4,189,1448,8,189,11,189,12,189,1449,1,190,1,190, - 1,190,1,190,1,1389,0,191,3,1,5,2,7,3,9,4,11,5,13,6,15,7,17,8,19,9,21, - 10,23,11,25,12,27,13,29,14,31,15,33,16,35,17,37,18,39,19,41,20,43,21, - 45,22,47,23,49,24,51,25,53,26,55,27,57,28,59,29,61,30,63,31,65,32,67, - 33,69,34,71,35,73,36,75,37,77,38,79,39,81,40,83,41,85,42,87,43,89,44, - 91,45,93,46,95,47,97,48,99,49,101,50,103,51,105,52,107,53,109,54,111, - 55,113,56,115,57,117,58,119,59,121,60,123,61,125,62,127,63,129,64,131, - 65,133,66,135,67,137,68,139,69,141,70,143,71,145,72,147,73,149,74,151, - 75,153,76,155,77,157,78,159,79,161,80,163,81,165,82,167,83,169,84,171, - 85,173,86,175,87,177,88,179,89,181,90,183,91,185,92,187,93,189,94,191, - 95,193,96,195,97,197,98,199,99,201,100,203,101,205,102,207,103,209,104, - 211,105,213,106,215,107,217,108,219,109,221,110,223,111,225,0,227,0,229, - 0,231,0,233,0,235,0,237,0,239,0,241,0,243,0,245,0,247,0,249,0,251,0,253, - 0,255,0,257,0,259,0,261,0,263,0,265,0,267,0,269,0,271,0,273,0,275,0,277, - 0,279,0,281,0,283,0,285,112,287,113,289,114,291,115,293,116,295,117,297, - 118,299,119,301,120,303,121,305,122,307,123,309,124,311,125,313,126,315, - 127,317,128,319,129,321,130,323,131,325,132,327,133,329,134,331,135,333, - 136,335,137,337,138,339,139,341,140,343,141,345,142,347,143,349,144,351, - 145,353,146,355,147,357,148,359,149,361,150,363,151,365,152,367,153,369, - 154,371,155,373,156,375,157,377,158,379,0,381,159,383,160,3,0,1,2,38, + 7,187,2,188,7,188,2,189,7,189,2,190,7,190,2,191,7,191,2,192,7,192,1,0, + 1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1, + 4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6, + 1,6,1,6,1,6,1,6,3,6,430,8,6,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1, + 8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11, + 1,12,1,12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14, + 1,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16, + 1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18, + 1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21, + 1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22, + 1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24, + 1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1,27,1,27, + 1,27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29, + 1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,31,1,31,1,31, + 1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33, + 1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36, + 1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39, + 1,39,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42, + 1,42,1,42,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44, + 1,44,1,44,1,44,1,44,3,44,658,8,44,1,45,1,45,1,45,1,45,1,45,1,45,1,46, + 1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1,47,1,47, + 1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1,49,1,50,1,50, + 1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,52,1,52,1,52,1,52, + 1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,55,1,55,1,55,1,55, + 1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57, + 1,58,1,58,1,58,1,58,1,58,1,58,1,59,1,59,1,59,1,59,1,60,1,60,1,60,1,60, + 1,61,1,61,1,61,1,61,1,61,1,62,1,62,1,62,1,62,1,62,1,62,1,63,1,63,1,63, + 1,63,1,63,1,63,1,63,1,64,1,64,1,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66, + 1,66,1,66,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69, + 1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70, + 1,70,1,70,1,70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71, + 1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73, + 1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1,76, + 1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,78,1,78,1,78,1,78, + 1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80,1,80,1,80, + 1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,83, + 1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84, + 1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86, + 1,86,1,87,1,87,1,87,1,87,1,87,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88, + 1,88,1,88,1,89,1,89,1,89,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1,91,1,91, + 1,91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93, + 1,93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95, + 1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97, + 1,97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99, + 1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,102, + 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103,1,103, + 1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105,1,105,1,105, + 1,105,1,105,1,105,3,105,1042,8,105,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,3,106,1071,8,106, + 1,107,1,107,1,107,3,107,1076,8,107,1,107,1,107,1,107,1,107,5,107,1082, + 8,107,10,107,12,107,1085,9,107,1,107,1,107,1,107,1,107,1,107,1,107,1, + 107,1,107,1,107,5,107,1096,8,107,10,107,12,107,1099,9,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,5,107,1112,8,107, + 10,107,12,107,1115,9,107,1,107,1,107,3,107,1119,8,107,1,108,1,108,1,108, + 5,108,1124,8,108,10,108,12,108,1127,9,108,1,108,1,108,3,108,1131,8,108, + 1,108,1,108,3,108,1135,8,108,1,108,4,108,1138,8,108,11,108,12,108,1139, + 1,108,1,108,1,108,3,108,1145,8,108,1,108,1,108,3,108,1149,8,108,1,108, + 4,108,1152,8,108,11,108,12,108,1153,1,108,1,108,1,108,5,108,1159,8,108, + 10,108,12,108,1162,9,108,1,108,1,108,1,108,3,108,1167,8,108,1,108,4,108, + 1170,8,108,11,108,12,108,1171,1,108,1,108,1,108,1,108,1,108,3,108,1179, + 8,108,1,108,4,108,1182,8,108,11,108,12,108,1183,1,108,1,108,1,108,1,108, + 3,108,1190,8,108,1,108,4,108,1193,8,108,11,108,12,108,1194,3,108,1197, + 8,108,1,109,1,109,4,109,1201,8,109,11,109,12,109,1202,1,110,4,110,1206, + 8,110,11,110,12,110,1207,1,111,1,111,1,111,4,111,1213,8,111,11,111,12, + 111,1214,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,1,112,5,112, + 1226,8,112,10,112,12,112,1229,9,112,1,112,1,112,1,113,1,113,1,114,1,114, + 1,115,1,115,1,116,1,116,1,117,1,117,1,118,1,118,1,119,1,119,1,120,1,120, + 1,121,1,121,1,122,1,122,1,123,1,123,1,124,1,124,1,125,1,125,1,126,1,126, + 1,127,1,127,1,128,1,128,1,129,1,129,1,130,1,130,1,131,1,131,1,132,1,132, + 1,133,1,133,1,134,1,134,1,135,1,135,1,136,1,136,1,137,1,137,1,138,1,138, + 1,139,1,139,1,140,1,140,1,141,1,141,1,142,1,142,1,143,1,143,1,143,1,144, + 1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,148,1,148,1,149,1,149,1,149, + 1,150,1,150,1,151,1,151,1,152,1,152,1,153,1,153,1,153,1,154,1,154,1,155, + 1,155,1,155,1,156,1,156,1,157,1,157,1,158,1,158,1,158,1,159,1,159,1,159, + 1,159,1,160,1,160,1,160,1,160,1,161,1,161,1,162,1,162,1,163,1,163,1,163, + 1,164,1,164,1,165,1,165,1,165,1,165,3,165,1351,8,165,1,166,1,166,1,166, + 1,166,1,167,1,167,1,167,1,168,1,168,1,168,1,169,1,169,1,169,1,170,1,170, + 1,171,1,171,1,172,1,172,1,173,1,173,1,174,1,174,1,174,1,174,1,174,1,175, + 1,175,1,175,1,175,1,175,1,176,1,176,1,177,1,177,1,178,1,178,1,178,1,179, + 1,179,1,179,1,179,1,180,1,180,1,181,1,181,1,182,1,182,1,183,1,183,1,184, + 1,184,1,185,1,185,1,185,1,185,5,185,1409,8,185,10,185,12,185,1412,9,185, + 1,185,1,185,1,185,1,185,1,185,1,186,1,186,1,186,1,186,3,186,1423,8,186, + 1,186,5,186,1426,8,186,10,186,12,186,1429,9,186,1,186,3,186,1432,8,186, + 1,186,1,186,1,187,1,187,1,187,1,187,1,188,1,188,1,188,1,188,1,188,1,188, + 1,188,1,188,1,188,1,188,1,188,4,188,1451,8,188,11,188,12,188,1452,1,189, + 1,189,1,189,1,189,1,190,1,190,1,190,1,190,1,190,1,191,1,191,1,191,1,191, + 1,191,4,191,1469,8,191,11,191,12,191,1470,1,192,1,192,1,192,1,192,1,1410, + 0,193,3,1,5,2,7,3,9,4,11,5,13,6,15,7,17,8,19,9,21,10,23,11,25,12,27,13, + 29,14,31,15,33,16,35,17,37,18,39,19,41,20,43,21,45,22,47,23,49,24,51, + 25,53,26,55,27,57,28,59,29,61,30,63,31,65,32,67,33,69,34,71,35,73,36, + 75,37,77,38,79,39,81,40,83,41,85,42,87,43,89,44,91,45,93,46,95,47,97, + 48,99,49,101,50,103,51,105,52,107,53,109,54,111,55,113,56,115,57,117, + 58,119,59,121,60,123,61,125,62,127,63,129,64,131,65,133,66,135,67,137, + 68,139,69,141,70,143,71,145,72,147,73,149,74,151,75,153,76,155,77,157, + 78,159,79,161,80,163,81,165,82,167,83,169,84,171,85,173,86,175,87,177, + 88,179,89,181,90,183,91,185,92,187,93,189,94,191,95,193,96,195,97,197, + 98,199,99,201,100,203,101,205,102,207,103,209,104,211,105,213,106,215, + 107,217,108,219,109,221,110,223,111,225,112,227,113,229,0,231,0,233,0, + 235,0,237,0,239,0,241,0,243,0,245,0,247,0,249,0,251,0,253,0,255,0,257, + 0,259,0,261,0,263,0,265,0,267,0,269,0,271,0,273,0,275,0,277,0,279,0,281, + 0,283,0,285,0,287,0,289,114,291,115,293,116,295,117,297,118,299,119,301, + 120,303,121,305,122,307,123,309,124,311,125,313,126,315,127,317,128,319, + 129,321,130,323,131,325,132,327,133,329,134,331,135,333,136,335,137,337, + 138,339,139,341,140,343,141,345,142,347,143,349,144,351,145,353,146,355, + 147,357,148,359,149,361,150,363,151,365,152,367,153,369,154,371,155,373, + 156,375,157,377,158,379,159,381,160,383,0,385,161,387,162,3,0,1,2,38, 2,0,92,92,96,96,2,0,34,34,92,92,2,0,39,39,92,92,2,0,65,65,97,97,2,0,66, 66,98,98,2,0,67,67,99,99,2,0,68,68,100,100,2,0,69,69,101,101,2,0,70,70, 102,102,2,0,71,71,103,103,2,0,72,72,104,104,2,0,73,73,105,105,2,0,74, @@ -276,7 +278,7 @@ void hogqllexerLexerInitialize() { 2,0,86,86,118,118,2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121, 2,0,90,90,122,122,2,0,65,90,97,122,1,0,48,55,1,0,48,57,3,0,48,57,65,70, 97,102,2,0,10,10,13,13,2,1,10,10,13,13,2,0,9,13,32,32,3,0,39,39,92,92, - 123,123,1,0,123,123,1491,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0, + 123,123,1,0,123,123,1512,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0,0,9,1,0, 0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0,0,19,1,0,0,0, 0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0,0,29,1,0,0,0,0,31, 1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0,0,39,1,0,0,0,0,41,1,0, @@ -297,8 +299,8 @@ void hogqllexerLexerInitialize() { 0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0,191,1,0,0,0,0,193,1,0,0,0,0,195,1, 0,0,0,0,197,1,0,0,0,0,199,1,0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1, 0,0,0,0,207,1,0,0,0,0,209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1, - 0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,285,1, - 0,0,0,0,287,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1, + 0,0,0,0,217,1,0,0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1, + 0,0,0,0,227,1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1, 0,0,0,0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1, 0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0,315,1, 0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0,0,0,0,325,1, @@ -306,365 +308,371 @@ void hogqllexerLexerInitialize() { 0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0,0,343,1,0,0,0,0,345,1, 0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1,0,0,0,0,353,1,0,0,0,0,355,1, 0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0,361,1,0,0,0,0,363,1,0,0,0,0,365,1, - 0,0,0,0,367,1,0,0,0,0,369,1,0,0,0,0,371,1,0,0,0,0,373,1,0,0,0,1,375,1, - 0,0,0,1,377,1,0,0,0,1,379,1,0,0,0,2,381,1,0,0,0,2,383,1,0,0,0,3,385,1, - 0,0,0,5,389,1,0,0,0,7,393,1,0,0,0,9,398,1,0,0,0,11,402,1,0,0,0,13,408, - 1,0,0,0,15,425,1,0,0,0,17,427,1,0,0,0,19,432,1,0,0,0,21,440,1,0,0,0,23, - 445,1,0,0,0,25,448,1,0,0,0,27,453,1,0,0,0,29,458,1,0,0,0,31,464,1,0,0, - 0,33,471,1,0,0,0,35,479,1,0,0,0,37,485,1,0,0,0,39,490,1,0,0,0,41,498, - 1,0,0,0,43,503,1,0,0,0,45,507,1,0,0,0,47,512,1,0,0,0,49,523,1,0,0,0,51, - 532,1,0,0,0,53,537,1,0,0,0,55,541,1,0,0,0,57,549,1,0,0,0,59,555,1,0,0, - 0,61,563,1,0,0,0,63,569,1,0,0,0,65,572,1,0,0,0,67,582,1,0,0,0,69,586, - 1,0,0,0,71,591,1,0,0,0,73,596,1,0,0,0,75,600,1,0,0,0,77,606,1,0,0,0,79, - 613,1,0,0,0,81,618,1,0,0,0,83,621,1,0,0,0,85,624,1,0,0,0,87,630,1,0,0, - 0,89,646,1,0,0,0,91,648,1,0,0,0,93,654,1,0,0,0,95,663,1,0,0,0,97,666, - 1,0,0,0,99,671,1,0,0,0,101,675,1,0,0,0,103,680,1,0,0,0,105,688,1,0,0, - 0,107,693,1,0,0,0,109,697,1,0,0,0,111,702,1,0,0,0,113,708,1,0,0,0,115, - 715,1,0,0,0,117,721,1,0,0,0,119,725,1,0,0,0,121,729,1,0,0,0,123,734,1, - 0,0,0,125,740,1,0,0,0,127,747,1,0,0,0,129,750,1,0,0,0,131,753,1,0,0,0, - 133,759,1,0,0,0,135,765,1,0,0,0,137,770,1,0,0,0,139,780,1,0,0,0,141,790, - 1,0,0,0,143,799,1,0,0,0,145,807,1,0,0,0,147,813,1,0,0,0,149,820,1,0,0, - 0,151,826,1,0,0,0,153,833,1,0,0,0,155,837,1,0,0,0,157,842,1,0,0,0,159, - 849,1,0,0,0,161,856,1,0,0,0,163,863,1,0,0,0,165,868,1,0,0,0,167,877,1, - 0,0,0,169,887,1,0,0,0,171,892,1,0,0,0,173,898,1,0,0,0,175,903,1,0,0,0, - 177,913,1,0,0,0,179,916,1,0,0,0,181,920,1,0,0,0,183,927,1,0,0,0,185,936, - 1,0,0,0,187,941,1,0,0,0,189,950,1,0,0,0,191,954,1,0,0,0,193,964,1,0,0, - 0,195,970,1,0,0,0,197,976,1,0,0,0,199,981,1,0,0,0,201,986,1,0,0,0,203, - 992,1,0,0,0,205,998,1,0,0,0,207,1005,1,0,0,0,209,1020,1,0,0,0,211,1049, - 1,0,0,0,213,1097,1,0,0,0,215,1175,1,0,0,0,217,1177,1,0,0,0,219,1184,1, - 0,0,0,221,1188,1,0,0,0,223,1195,1,0,0,0,225,1211,1,0,0,0,227,1213,1,0, - 0,0,229,1215,1,0,0,0,231,1217,1,0,0,0,233,1219,1,0,0,0,235,1221,1,0,0, - 0,237,1223,1,0,0,0,239,1225,1,0,0,0,241,1227,1,0,0,0,243,1229,1,0,0,0, - 245,1231,1,0,0,0,247,1233,1,0,0,0,249,1235,1,0,0,0,251,1237,1,0,0,0,253, - 1239,1,0,0,0,255,1241,1,0,0,0,257,1243,1,0,0,0,259,1245,1,0,0,0,261,1247, - 1,0,0,0,263,1249,1,0,0,0,265,1251,1,0,0,0,267,1253,1,0,0,0,269,1255,1, - 0,0,0,271,1257,1,0,0,0,273,1259,1,0,0,0,275,1261,1,0,0,0,277,1263,1,0, - 0,0,279,1265,1,0,0,0,281,1267,1,0,0,0,283,1269,1,0,0,0,285,1271,1,0,0, - 0,287,1274,1,0,0,0,289,1276,1,0,0,0,291,1278,1,0,0,0,293,1280,1,0,0,0, - 295,1282,1,0,0,0,297,1284,1,0,0,0,299,1287,1,0,0,0,301,1289,1,0,0,0,303, - 1291,1,0,0,0,305,1293,1,0,0,0,307,1296,1,0,0,0,309,1298,1,0,0,0,311,1301, - 1,0,0,0,313,1303,1,0,0,0,315,1305,1,0,0,0,317,1308,1,0,0,0,319,1312,1, - 0,0,0,321,1316,1,0,0,0,323,1318,1,0,0,0,325,1320,1,0,0,0,327,1323,1,0, - 0,0,329,1329,1,0,0,0,331,1331,1,0,0,0,333,1335,1,0,0,0,335,1338,1,0,0, - 0,337,1341,1,0,0,0,339,1344,1,0,0,0,341,1346,1,0,0,0,343,1348,1,0,0,0, - 345,1350,1,0,0,0,347,1352,1,0,0,0,349,1357,1,0,0,0,351,1362,1,0,0,0,353, - 1364,1,0,0,0,355,1366,1,0,0,0,357,1369,1,0,0,0,359,1373,1,0,0,0,361,1375, - 1,0,0,0,363,1377,1,0,0,0,365,1379,1,0,0,0,367,1381,1,0,0,0,369,1383,1, - 0,0,0,371,1401,1,0,0,0,373,1414,1,0,0,0,375,1429,1,0,0,0,377,1433,1,0, - 0,0,379,1437,1,0,0,0,381,1447,1,0,0,0,383,1451,1,0,0,0,385,386,3,225, - 111,0,386,387,3,247,122,0,387,388,3,247,122,0,388,4,1,0,0,0,389,390,3, - 225,111,0,390,391,3,251,124,0,391,392,3,231,114,0,392,6,1,0,0,0,393,394, - 3,225,111,0,394,395,3,251,124,0,395,396,3,263,130,0,396,397,3,241,119, - 0,397,8,1,0,0,0,398,399,3,225,111,0,399,400,3,251,124,0,400,401,3,273, - 135,0,401,10,1,0,0,0,402,403,3,225,111,0,403,404,3,259,128,0,404,405, - 3,259,128,0,405,406,3,225,111,0,406,407,3,273,135,0,407,12,1,0,0,0,408, - 409,3,225,111,0,409,410,3,261,129,0,410,14,1,0,0,0,411,412,3,225,111, - 0,412,413,3,261,129,0,413,414,3,229,113,0,414,426,1,0,0,0,415,416,3,225, - 111,0,416,417,3,261,129,0,417,418,3,229,113,0,418,419,3,233,115,0,419, - 420,3,251,124,0,420,421,3,231,114,0,421,422,3,241,119,0,422,423,3,251, - 124,0,423,424,3,237,117,0,424,426,1,0,0,0,425,411,1,0,0,0,425,415,1,0, - 0,0,426,16,1,0,0,0,427,428,3,225,111,0,428,429,3,261,129,0,429,430,3, - 253,125,0,430,431,3,235,116,0,431,18,1,0,0,0,432,433,3,227,112,0,433, - 434,3,233,115,0,434,435,3,263,130,0,435,436,3,269,133,0,436,437,3,233, - 115,0,437,438,3,233,115,0,438,439,3,251,124,0,439,20,1,0,0,0,440,441, - 3,227,112,0,441,442,3,253,125,0,442,443,3,263,130,0,443,444,3,239,118, - 0,444,22,1,0,0,0,445,446,3,227,112,0,446,447,3,273,135,0,447,24,1,0,0, - 0,448,449,3,229,113,0,449,450,3,225,111,0,450,451,3,261,129,0,451,452, - 3,233,115,0,452,26,1,0,0,0,453,454,3,229,113,0,454,455,3,225,111,0,455, - 456,3,261,129,0,456,457,3,263,130,0,457,28,1,0,0,0,458,459,3,229,113, - 0,459,460,3,225,111,0,460,461,3,263,130,0,461,462,3,229,113,0,462,463, - 3,239,118,0,463,30,1,0,0,0,464,465,3,229,113,0,465,466,3,253,125,0,466, - 467,3,239,118,0,467,468,3,253,125,0,468,469,3,259,128,0,469,470,3,263, - 130,0,470,32,1,0,0,0,471,472,3,229,113,0,472,473,3,253,125,0,473,474, - 3,247,122,0,474,475,3,247,122,0,475,476,3,225,111,0,476,477,3,263,130, - 0,477,478,3,233,115,0,478,34,1,0,0,0,479,480,3,229,113,0,480,481,3,259, - 128,0,481,482,3,253,125,0,482,483,3,261,129,0,483,484,3,261,129,0,484, - 36,1,0,0,0,485,486,3,229,113,0,486,487,3,265,131,0,487,488,3,227,112, - 0,488,489,3,233,115,0,489,38,1,0,0,0,490,491,3,229,113,0,491,492,3,265, - 131,0,492,493,3,259,128,0,493,494,3,259,128,0,494,495,3,233,115,0,495, - 496,3,251,124,0,496,497,3,263,130,0,497,40,1,0,0,0,498,499,3,231,114, - 0,499,500,3,225,111,0,500,501,3,263,130,0,501,502,3,233,115,0,502,42, - 1,0,0,0,503,504,3,231,114,0,504,505,3,225,111,0,505,506,3,273,135,0,506, - 44,1,0,0,0,507,508,3,231,114,0,508,509,3,233,115,0,509,510,3,261,129, - 0,510,511,3,229,113,0,511,46,1,0,0,0,512,513,3,231,114,0,513,514,3,233, - 115,0,514,515,3,261,129,0,515,516,3,229,113,0,516,517,3,233,115,0,517, - 518,3,251,124,0,518,519,3,231,114,0,519,520,3,241,119,0,520,521,3,251, - 124,0,521,522,3,237,117,0,522,48,1,0,0,0,523,524,3,231,114,0,524,525, - 3,241,119,0,525,526,3,261,129,0,526,527,3,263,130,0,527,528,3,241,119, - 0,528,529,3,251,124,0,529,530,3,229,113,0,530,531,3,263,130,0,531,50, - 1,0,0,0,532,533,3,233,115,0,533,534,3,247,122,0,534,535,3,261,129,0,535, - 536,3,233,115,0,536,52,1,0,0,0,537,538,3,233,115,0,538,539,3,251,124, - 0,539,540,3,231,114,0,540,54,1,0,0,0,541,542,3,233,115,0,542,543,3,271, - 134,0,543,544,3,263,130,0,544,545,3,259,128,0,545,546,3,225,111,0,546, - 547,3,229,113,0,547,548,3,263,130,0,548,56,1,0,0,0,549,550,3,235,116, - 0,550,551,3,241,119,0,551,552,3,251,124,0,552,553,3,225,111,0,553,554, - 3,247,122,0,554,58,1,0,0,0,555,556,3,235,116,0,556,557,3,241,119,0,557, - 558,3,251,124,0,558,559,3,225,111,0,559,560,3,247,122,0,560,561,3,247, - 122,0,561,562,3,273,135,0,562,60,1,0,0,0,563,564,3,235,116,0,564,565, - 3,241,119,0,565,566,3,259,128,0,566,567,3,261,129,0,567,568,3,263,130, - 0,568,62,1,0,0,0,569,570,3,235,116,0,570,571,3,251,124,0,571,64,1,0,0, - 0,572,573,3,235,116,0,573,574,3,253,125,0,574,575,3,247,122,0,575,576, - 3,247,122,0,576,577,3,253,125,0,577,578,3,269,133,0,578,579,3,241,119, - 0,579,580,3,251,124,0,580,581,3,237,117,0,581,66,1,0,0,0,582,583,3,235, - 116,0,583,584,3,253,125,0,584,585,3,259,128,0,585,68,1,0,0,0,586,587, - 3,235,116,0,587,588,3,259,128,0,588,589,3,253,125,0,589,590,3,249,123, - 0,590,70,1,0,0,0,591,592,3,235,116,0,592,593,3,265,131,0,593,594,3,247, - 122,0,594,595,3,247,122,0,595,72,1,0,0,0,596,597,3,235,116,0,597,598, - 3,265,131,0,598,599,3,251,124,0,599,74,1,0,0,0,600,601,3,237,117,0,601, - 602,3,259,128,0,602,603,3,253,125,0,603,604,3,265,131,0,604,605,3,255, - 126,0,605,76,1,0,0,0,606,607,3,239,118,0,607,608,3,225,111,0,608,609, - 3,267,132,0,609,610,3,241,119,0,610,611,3,251,124,0,611,612,3,237,117, - 0,612,78,1,0,0,0,613,614,3,239,118,0,614,615,3,253,125,0,615,616,3,265, - 131,0,616,617,3,259,128,0,617,80,1,0,0,0,618,619,3,241,119,0,619,620, - 3,231,114,0,620,82,1,0,0,0,621,622,3,241,119,0,622,623,3,235,116,0,623, - 84,1,0,0,0,624,625,3,241,119,0,625,626,3,247,122,0,626,627,3,241,119, - 0,627,628,3,245,121,0,628,629,3,233,115,0,629,86,1,0,0,0,630,631,3,241, - 119,0,631,632,3,251,124,0,632,88,1,0,0,0,633,634,3,241,119,0,634,635, - 3,251,124,0,635,636,3,235,116,0,636,647,1,0,0,0,637,638,3,241,119,0,638, - 639,3,251,124,0,639,640,3,235,116,0,640,641,3,241,119,0,641,642,3,251, - 124,0,642,643,3,241,119,0,643,644,3,263,130,0,644,645,3,273,135,0,645, - 647,1,0,0,0,646,633,1,0,0,0,646,637,1,0,0,0,647,90,1,0,0,0,648,649,3, - 241,119,0,649,650,3,251,124,0,650,651,3,251,124,0,651,652,3,233,115,0, - 652,653,3,259,128,0,653,92,1,0,0,0,654,655,3,241,119,0,655,656,3,251, - 124,0,656,657,3,263,130,0,657,658,3,233,115,0,658,659,3,259,128,0,659, - 660,3,267,132,0,660,661,3,225,111,0,661,662,3,247,122,0,662,94,1,0,0, - 0,663,664,3,241,119,0,664,665,3,261,129,0,665,96,1,0,0,0,666,667,3,243, - 120,0,667,668,3,253,125,0,668,669,3,241,119,0,669,670,3,251,124,0,670, - 98,1,0,0,0,671,672,3,245,121,0,672,673,3,233,115,0,673,674,3,273,135, - 0,674,100,1,0,0,0,675,676,3,247,122,0,676,677,3,225,111,0,677,678,3,261, - 129,0,678,679,3,263,130,0,679,102,1,0,0,0,680,681,3,247,122,0,681,682, - 3,233,115,0,682,683,3,225,111,0,683,684,3,231,114,0,684,685,3,241,119, - 0,685,686,3,251,124,0,686,687,3,237,117,0,687,104,1,0,0,0,688,689,3,247, - 122,0,689,690,3,233,115,0,690,691,3,235,116,0,691,692,3,263,130,0,692, - 106,1,0,0,0,693,694,3,247,122,0,694,695,3,233,115,0,695,696,3,263,130, - 0,696,108,1,0,0,0,697,698,3,247,122,0,698,699,3,241,119,0,699,700,3,245, - 121,0,700,701,3,233,115,0,701,110,1,0,0,0,702,703,3,247,122,0,703,704, - 3,241,119,0,704,705,3,249,123,0,705,706,3,241,119,0,706,707,3,263,130, - 0,707,112,1,0,0,0,708,709,3,249,123,0,709,710,3,241,119,0,710,711,3,251, - 124,0,711,712,3,265,131,0,712,713,3,263,130,0,713,714,3,233,115,0,714, - 114,1,0,0,0,715,716,3,249,123,0,716,717,3,253,125,0,717,718,3,251,124, - 0,718,719,3,263,130,0,719,720,3,239,118,0,720,116,1,0,0,0,721,722,3,251, - 124,0,722,723,3,225,111,0,723,724,3,251,124,0,724,118,1,0,0,0,725,726, - 3,251,124,0,726,727,3,253,125,0,727,728,3,263,130,0,728,120,1,0,0,0,729, - 730,3,251,124,0,730,731,3,265,131,0,731,732,3,247,122,0,732,733,3,247, - 122,0,733,122,1,0,0,0,734,735,3,251,124,0,735,736,3,265,131,0,736,737, - 3,247,122,0,737,738,3,247,122,0,738,739,3,261,129,0,739,124,1,0,0,0,740, - 741,3,253,125,0,741,742,3,235,116,0,742,743,3,235,116,0,743,744,3,261, - 129,0,744,745,3,233,115,0,745,746,3,263,130,0,746,126,1,0,0,0,747,748, - 3,253,125,0,748,749,3,251,124,0,749,128,1,0,0,0,750,751,3,253,125,0,751, - 752,3,259,128,0,752,130,1,0,0,0,753,754,3,253,125,0,754,755,3,259,128, - 0,755,756,3,231,114,0,756,757,3,233,115,0,757,758,3,259,128,0,758,132, - 1,0,0,0,759,760,3,253,125,0,760,761,3,265,131,0,761,762,3,263,130,0,762, - 763,3,233,115,0,763,764,3,259,128,0,764,134,1,0,0,0,765,766,3,253,125, - 0,766,767,3,267,132,0,767,768,3,233,115,0,768,769,3,259,128,0,769,136, - 1,0,0,0,770,771,3,255,126,0,771,772,3,225,111,0,772,773,3,259,128,0,773, - 774,3,263,130,0,774,775,3,241,119,0,775,776,3,263,130,0,776,777,3,241, - 119,0,777,778,3,253,125,0,778,779,3,251,124,0,779,138,1,0,0,0,780,781, - 3,255,126,0,781,782,3,259,128,0,782,783,3,233,115,0,783,784,3,229,113, - 0,784,785,3,233,115,0,785,786,3,231,114,0,786,787,3,241,119,0,787,788, - 3,251,124,0,788,789,3,237,117,0,789,140,1,0,0,0,790,791,3,255,126,0,791, - 792,3,259,128,0,792,793,3,233,115,0,793,794,3,269,133,0,794,795,3,239, - 118,0,795,796,3,233,115,0,796,797,3,259,128,0,797,798,3,233,115,0,798, - 142,1,0,0,0,799,800,3,257,127,0,800,801,3,265,131,0,801,802,3,225,111, - 0,802,803,3,259,128,0,803,804,3,263,130,0,804,805,3,233,115,0,805,806, - 3,259,128,0,806,144,1,0,0,0,807,808,3,259,128,0,808,809,3,225,111,0,809, - 810,3,251,124,0,810,811,3,237,117,0,811,812,3,233,115,0,812,146,1,0,0, - 0,813,814,3,259,128,0,814,815,3,233,115,0,815,816,3,263,130,0,816,817, - 3,265,131,0,817,818,3,259,128,0,818,819,3,251,124,0,819,148,1,0,0,0,820, - 821,3,259,128,0,821,822,3,241,119,0,822,823,3,237,117,0,823,824,3,239, - 118,0,824,825,3,263,130,0,825,150,1,0,0,0,826,827,3,259,128,0,827,828, - 3,253,125,0,828,829,3,247,122,0,829,830,3,247,122,0,830,831,3,265,131, - 0,831,832,3,255,126,0,832,152,1,0,0,0,833,834,3,259,128,0,834,835,3,253, - 125,0,835,836,3,269,133,0,836,154,1,0,0,0,837,838,3,259,128,0,838,839, - 3,253,125,0,839,840,3,269,133,0,840,841,3,261,129,0,841,156,1,0,0,0,842, - 843,3,261,129,0,843,844,3,225,111,0,844,845,3,249,123,0,845,846,3,255, - 126,0,846,847,3,247,122,0,847,848,3,233,115,0,848,158,1,0,0,0,849,850, - 3,261,129,0,850,851,3,233,115,0,851,852,3,229,113,0,852,853,3,253,125, - 0,853,854,3,251,124,0,854,855,3,231,114,0,855,160,1,0,0,0,856,857,3,261, - 129,0,857,858,3,233,115,0,858,859,3,247,122,0,859,860,3,233,115,0,860, - 861,3,229,113,0,861,862,3,263,130,0,862,162,1,0,0,0,863,864,3,261,129, - 0,864,865,3,233,115,0,865,866,3,249,123,0,866,867,3,241,119,0,867,164, - 1,0,0,0,868,869,3,261,129,0,869,870,3,233,115,0,870,871,3,263,130,0,871, - 872,3,263,130,0,872,873,3,241,119,0,873,874,3,251,124,0,874,875,3,237, - 117,0,875,876,3,261,129,0,876,166,1,0,0,0,877,878,3,261,129,0,878,879, - 3,265,131,0,879,880,3,227,112,0,880,881,3,261,129,0,881,882,3,263,130, - 0,882,883,3,259,128,0,883,884,3,241,119,0,884,885,3,251,124,0,885,886, - 3,237,117,0,886,168,1,0,0,0,887,888,3,263,130,0,888,889,3,239,118,0,889, - 890,3,233,115,0,890,891,3,251,124,0,891,170,1,0,0,0,892,893,3,263,130, - 0,893,894,3,239,118,0,894,895,3,259,128,0,895,896,3,253,125,0,896,897, - 3,269,133,0,897,172,1,0,0,0,898,899,3,263,130,0,899,900,3,241,119,0,900, - 901,3,233,115,0,901,902,3,261,129,0,902,174,1,0,0,0,903,904,3,263,130, - 0,904,905,3,241,119,0,905,906,3,249,123,0,906,907,3,233,115,0,907,908, - 3,261,129,0,908,909,3,263,130,0,909,910,3,225,111,0,910,911,3,249,123, - 0,911,912,3,255,126,0,912,176,1,0,0,0,913,914,3,263,130,0,914,915,3,253, - 125,0,915,178,1,0,0,0,916,917,3,263,130,0,917,918,3,253,125,0,918,919, - 3,255,126,0,919,180,1,0,0,0,920,921,3,263,130,0,921,922,3,253,125,0,922, - 923,3,263,130,0,923,924,3,225,111,0,924,925,3,247,122,0,925,926,3,261, - 129,0,926,182,1,0,0,0,927,928,3,263,130,0,928,929,3,259,128,0,929,930, - 3,225,111,0,930,931,3,241,119,0,931,932,3,247,122,0,932,933,3,241,119, - 0,933,934,3,251,124,0,934,935,3,237,117,0,935,184,1,0,0,0,936,937,3,263, - 130,0,937,938,3,259,128,0,938,939,3,241,119,0,939,940,3,249,123,0,940, - 186,1,0,0,0,941,942,3,263,130,0,942,943,3,259,128,0,943,944,3,265,131, - 0,944,945,3,251,124,0,945,946,3,229,113,0,946,947,3,225,111,0,947,948, - 3,263,130,0,948,949,3,233,115,0,949,188,1,0,0,0,950,951,3,263,130,0,951, - 952,3,259,128,0,952,953,3,273,135,0,953,190,1,0,0,0,954,955,3,265,131, - 0,955,956,3,251,124,0,956,957,3,227,112,0,957,958,3,253,125,0,958,959, - 3,265,131,0,959,960,3,251,124,0,960,961,3,231,114,0,961,962,3,233,115, - 0,962,963,3,231,114,0,963,192,1,0,0,0,964,965,3,265,131,0,965,966,3,251, - 124,0,966,967,3,241,119,0,967,968,3,253,125,0,968,969,3,251,124,0,969, - 194,1,0,0,0,970,971,3,265,131,0,971,972,3,261,129,0,972,973,3,241,119, - 0,973,974,3,251,124,0,974,975,3,237,117,0,975,196,1,0,0,0,976,977,3,269, - 133,0,977,978,3,233,115,0,978,979,3,233,115,0,979,980,3,245,121,0,980, - 198,1,0,0,0,981,982,3,269,133,0,982,983,3,239,118,0,983,984,3,233,115, - 0,984,985,3,251,124,0,985,200,1,0,0,0,986,987,3,269,133,0,987,988,3,239, - 118,0,988,989,3,233,115,0,989,990,3,259,128,0,990,991,3,233,115,0,991, - 202,1,0,0,0,992,993,3,269,133,0,993,994,3,239,118,0,994,995,3,241,119, - 0,995,996,3,247,122,0,996,997,3,233,115,0,997,204,1,0,0,0,998,999,3,269, - 133,0,999,1000,3,241,119,0,1000,1001,3,251,124,0,1001,1002,3,231,114, - 0,1002,1003,3,253,125,0,1003,1004,3,269,133,0,1004,206,1,0,0,0,1005,1006, - 3,269,133,0,1006,1007,3,241,119,0,1007,1008,3,263,130,0,1008,1009,3,239, - 118,0,1009,208,1,0,0,0,1010,1011,3,273,135,0,1011,1012,3,233,115,0,1012, - 1013,3,225,111,0,1013,1014,3,259,128,0,1014,1021,1,0,0,0,1015,1016,3, - 273,135,0,1016,1017,3,273,135,0,1017,1018,3,273,135,0,1018,1019,3,273, - 135,0,1019,1021,1,0,0,0,1020,1010,1,0,0,0,1020,1015,1,0,0,0,1021,210, - 1,0,0,0,1022,1023,3,291,144,0,1023,1024,3,227,112,0,1024,1050,1,0,0,0, - 1025,1026,3,291,144,0,1026,1027,3,235,116,0,1027,1050,1,0,0,0,1028,1029, - 3,291,144,0,1029,1030,3,259,128,0,1030,1050,1,0,0,0,1031,1032,3,291,144, - 0,1032,1033,3,251,124,0,1033,1050,1,0,0,0,1034,1035,3,291,144,0,1035, - 1036,3,263,130,0,1036,1050,1,0,0,0,1037,1038,3,291,144,0,1038,1039,5, - 48,0,0,1039,1050,1,0,0,0,1040,1041,3,291,144,0,1041,1042,3,225,111,0, - 1042,1050,1,0,0,0,1043,1044,3,291,144,0,1044,1045,3,267,132,0,1045,1050, - 1,0,0,0,1046,1047,3,291,144,0,1047,1048,3,291,144,0,1048,1050,1,0,0,0, - 1049,1022,1,0,0,0,1049,1025,1,0,0,0,1049,1028,1,0,0,0,1049,1031,1,0,0, - 0,1049,1034,1,0,0,0,1049,1037,1,0,0,0,1049,1040,1,0,0,0,1049,1043,1,0, - 0,0,1049,1046,1,0,0,0,1050,212,1,0,0,0,1051,1055,3,277,137,0,1052,1055, - 3,367,182,0,1053,1055,3,301,149,0,1054,1051,1,0,0,0,1054,1052,1,0,0,0, - 1054,1053,1,0,0,0,1055,1062,1,0,0,0,1056,1061,3,277,137,0,1057,1061,3, - 367,182,0,1058,1061,3,281,139,0,1059,1061,3,301,149,0,1060,1056,1,0,0, - 0,1060,1057,1,0,0,0,1060,1058,1,0,0,0,1060,1059,1,0,0,0,1061,1064,1,0, - 0,0,1062,1060,1,0,0,0,1062,1063,1,0,0,0,1063,1098,1,0,0,0,1064,1062,1, - 0,0,0,1065,1076,3,289,143,0,1066,1075,8,0,0,0,1067,1075,3,211,104,0,1068, - 1069,3,291,144,0,1069,1070,3,351,174,0,1070,1075,1,0,0,0,1071,1072,3, - 289,143,0,1072,1073,3,289,143,0,1073,1075,1,0,0,0,1074,1066,1,0,0,0,1074, - 1067,1,0,0,0,1074,1068,1,0,0,0,1074,1071,1,0,0,0,1075,1078,1,0,0,0,1076, - 1074,1,0,0,0,1076,1077,1,0,0,0,1077,1079,1,0,0,0,1078,1076,1,0,0,0,1079, - 1080,3,289,143,0,1080,1098,1,0,0,0,1081,1092,3,345,171,0,1082,1091,8, - 1,0,0,1083,1091,3,211,104,0,1084,1085,3,291,144,0,1085,1086,3,345,171, - 0,1086,1091,1,0,0,0,1087,1088,3,345,171,0,1088,1089,3,345,171,0,1089, - 1091,1,0,0,0,1090,1082,1,0,0,0,1090,1083,1,0,0,0,1090,1084,1,0,0,0,1090, - 1087,1,0,0,0,1091,1094,1,0,0,0,1092,1090,1,0,0,0,1092,1093,1,0,0,0,1093, - 1095,1,0,0,0,1094,1092,1,0,0,0,1095,1096,3,345,171,0,1096,1098,1,0,0, - 0,1097,1054,1,0,0,0,1097,1065,1,0,0,0,1097,1081,1,0,0,0,1098,214,1,0, - 0,0,1099,1100,3,221,109,0,1100,1104,3,303,150,0,1101,1103,3,283,140,0, - 1102,1101,1,0,0,0,1103,1106,1,0,0,0,1104,1102,1,0,0,0,1104,1105,1,0,0, - 0,1105,1109,1,0,0,0,1106,1104,1,0,0,0,1107,1110,3,255,126,0,1108,1110, - 3,233,115,0,1109,1107,1,0,0,0,1109,1108,1,0,0,0,1110,1113,1,0,0,0,1111, - 1114,3,341,169,0,1112,1114,3,299,148,0,1113,1111,1,0,0,0,1113,1112,1, - 0,0,0,1113,1114,1,0,0,0,1114,1116,1,0,0,0,1115,1117,3,281,139,0,1116, - 1115,1,0,0,0,1117,1118,1,0,0,0,1118,1116,1,0,0,0,1118,1119,1,0,0,0,1119, - 1176,1,0,0,0,1120,1123,3,221,109,0,1121,1124,3,255,126,0,1122,1124,3, - 233,115,0,1123,1121,1,0,0,0,1123,1122,1,0,0,0,1124,1127,1,0,0,0,1125, - 1128,3,341,169,0,1126,1128,3,299,148,0,1127,1125,1,0,0,0,1127,1126,1, - 0,0,0,1127,1128,1,0,0,0,1128,1130,1,0,0,0,1129,1131,3,281,139,0,1130, - 1129,1,0,0,0,1131,1132,1,0,0,0,1132,1130,1,0,0,0,1132,1133,1,0,0,0,1133, - 1176,1,0,0,0,1134,1135,3,219,108,0,1135,1139,3,303,150,0,1136,1138,3, - 281,139,0,1137,1136,1,0,0,0,1138,1141,1,0,0,0,1139,1137,1,0,0,0,1139, - 1140,1,0,0,0,1140,1142,1,0,0,0,1141,1139,1,0,0,0,1142,1145,3,233,115, - 0,1143,1146,3,341,169,0,1144,1146,3,299,148,0,1145,1143,1,0,0,0,1145, - 1144,1,0,0,0,1145,1146,1,0,0,0,1146,1148,1,0,0,0,1147,1149,3,281,139, - 0,1148,1147,1,0,0,0,1149,1150,1,0,0,0,1150,1148,1,0,0,0,1150,1151,1,0, - 0,0,1151,1176,1,0,0,0,1152,1153,3,303,150,0,1153,1154,3,219,108,0,1154, - 1157,3,233,115,0,1155,1158,3,341,169,0,1156,1158,3,299,148,0,1157,1155, - 1,0,0,0,1157,1156,1,0,0,0,1157,1158,1,0,0,0,1158,1160,1,0,0,0,1159,1161, - 3,281,139,0,1160,1159,1,0,0,0,1161,1162,1,0,0,0,1162,1160,1,0,0,0,1162, - 1163,1,0,0,0,1163,1176,1,0,0,0,1164,1165,3,219,108,0,1165,1168,3,233, - 115,0,1166,1169,3,341,169,0,1167,1169,3,299,148,0,1168,1166,1,0,0,0,1168, - 1167,1,0,0,0,1168,1169,1,0,0,0,1169,1171,1,0,0,0,1170,1172,3,281,139, - 0,1171,1170,1,0,0,0,1172,1173,1,0,0,0,1173,1171,1,0,0,0,1173,1174,1,0, - 0,0,1174,1176,1,0,0,0,1175,1099,1,0,0,0,1175,1120,1,0,0,0,1175,1134,1, - 0,0,0,1175,1152,1,0,0,0,1175,1164,1,0,0,0,1176,216,1,0,0,0,1177,1179, - 5,48,0,0,1178,1180,3,279,138,0,1179,1178,1,0,0,0,1180,1181,1,0,0,0,1181, - 1179,1,0,0,0,1181,1182,1,0,0,0,1182,218,1,0,0,0,1183,1185,3,281,139,0, - 1184,1183,1,0,0,0,1185,1186,1,0,0,0,1186,1184,1,0,0,0,1186,1187,1,0,0, - 0,1187,220,1,0,0,0,1188,1189,5,48,0,0,1189,1191,3,271,134,0,1190,1192, - 3,283,140,0,1191,1190,1,0,0,0,1192,1193,1,0,0,0,1193,1191,1,0,0,0,1193, - 1194,1,0,0,0,1194,222,1,0,0,0,1195,1206,3,351,174,0,1196,1205,8,2,0,0, - 1197,1205,3,211,104,0,1198,1199,3,291,144,0,1199,1200,3,351,174,0,1200, - 1205,1,0,0,0,1201,1202,3,351,174,0,1202,1203,3,351,174,0,1203,1205,1, - 0,0,0,1204,1196,1,0,0,0,1204,1197,1,0,0,0,1204,1198,1,0,0,0,1204,1201, - 1,0,0,0,1205,1208,1,0,0,0,1206,1204,1,0,0,0,1206,1207,1,0,0,0,1207,1209, - 1,0,0,0,1208,1206,1,0,0,0,1209,1210,3,351,174,0,1210,224,1,0,0,0,1211, - 1212,7,3,0,0,1212,226,1,0,0,0,1213,1214,7,4,0,0,1214,228,1,0,0,0,1215, - 1216,7,5,0,0,1216,230,1,0,0,0,1217,1218,7,6,0,0,1218,232,1,0,0,0,1219, - 1220,7,7,0,0,1220,234,1,0,0,0,1221,1222,7,8,0,0,1222,236,1,0,0,0,1223, - 1224,7,9,0,0,1224,238,1,0,0,0,1225,1226,7,10,0,0,1226,240,1,0,0,0,1227, - 1228,7,11,0,0,1228,242,1,0,0,0,1229,1230,7,12,0,0,1230,244,1,0,0,0,1231, - 1232,7,13,0,0,1232,246,1,0,0,0,1233,1234,7,14,0,0,1234,248,1,0,0,0,1235, - 1236,7,15,0,0,1236,250,1,0,0,0,1237,1238,7,16,0,0,1238,252,1,0,0,0,1239, - 1240,7,17,0,0,1240,254,1,0,0,0,1241,1242,7,18,0,0,1242,256,1,0,0,0,1243, - 1244,7,19,0,0,1244,258,1,0,0,0,1245,1246,7,20,0,0,1246,260,1,0,0,0,1247, - 1248,7,21,0,0,1248,262,1,0,0,0,1249,1250,7,22,0,0,1250,264,1,0,0,0,1251, - 1252,7,23,0,0,1252,266,1,0,0,0,1253,1254,7,24,0,0,1254,268,1,0,0,0,1255, - 1256,7,25,0,0,1256,270,1,0,0,0,1257,1258,7,26,0,0,1258,272,1,0,0,0,1259, - 1260,7,27,0,0,1260,274,1,0,0,0,1261,1262,7,28,0,0,1262,276,1,0,0,0,1263, - 1264,7,29,0,0,1264,278,1,0,0,0,1265,1266,7,30,0,0,1266,280,1,0,0,0,1267, - 1268,7,31,0,0,1268,282,1,0,0,0,1269,1270,7,32,0,0,1270,284,1,0,0,0,1271, - 1272,5,45,0,0,1272,1273,5,62,0,0,1273,286,1,0,0,0,1274,1275,5,42,0,0, - 1275,288,1,0,0,0,1276,1277,5,96,0,0,1277,290,1,0,0,0,1278,1279,5,92,0, - 0,1279,292,1,0,0,0,1280,1281,5,58,0,0,1281,294,1,0,0,0,1282,1283,5,44, - 0,0,1283,296,1,0,0,0,1284,1285,5,124,0,0,1285,1286,5,124,0,0,1286,298, - 1,0,0,0,1287,1288,5,45,0,0,1288,300,1,0,0,0,1289,1290,5,36,0,0,1290,302, - 1,0,0,0,1291,1292,5,46,0,0,1292,304,1,0,0,0,1293,1294,5,61,0,0,1294,1295, - 5,61,0,0,1295,306,1,0,0,0,1296,1297,5,61,0,0,1297,308,1,0,0,0,1298,1299, - 5,62,0,0,1299,1300,5,61,0,0,1300,310,1,0,0,0,1301,1302,5,62,0,0,1302, - 312,1,0,0,0,1303,1304,5,35,0,0,1304,314,1,0,0,0,1305,1306,5,126,0,0,1306, - 1307,5,42,0,0,1307,316,1,0,0,0,1308,1309,5,61,0,0,1309,1310,5,126,0,0, - 1310,1311,5,42,0,0,1311,318,1,0,0,0,1312,1313,5,123,0,0,1313,1314,1,0, - 0,0,1314,1315,6,158,0,0,1315,320,1,0,0,0,1316,1317,5,91,0,0,1317,322, - 1,0,0,0,1318,1319,5,40,0,0,1319,324,1,0,0,0,1320,1321,5,60,0,0,1321,1322, - 5,61,0,0,1322,326,1,0,0,0,1323,1324,5,60,0,0,1324,328,1,0,0,0,1325,1326, - 5,33,0,0,1326,1330,5,61,0,0,1327,1328,5,60,0,0,1328,1330,5,62,0,0,1329, - 1325,1,0,0,0,1329,1327,1,0,0,0,1330,330,1,0,0,0,1331,1332,5,33,0,0,1332, - 1333,5,126,0,0,1333,1334,5,42,0,0,1334,332,1,0,0,0,1335,1336,5,33,0,0, - 1336,1337,5,126,0,0,1337,334,1,0,0,0,1338,1339,5,63,0,0,1339,1340,5,46, - 0,0,1340,336,1,0,0,0,1341,1342,5,63,0,0,1342,1343,5,63,0,0,1343,338,1, - 0,0,0,1344,1345,5,37,0,0,1345,340,1,0,0,0,1346,1347,5,43,0,0,1347,342, - 1,0,0,0,1348,1349,5,63,0,0,1349,344,1,0,0,0,1350,1351,5,34,0,0,1351,346, - 1,0,0,0,1352,1353,5,102,0,0,1353,1354,5,39,0,0,1354,1355,1,0,0,0,1355, - 1356,6,172,1,0,1356,348,1,0,0,0,1357,1358,5,70,0,0,1358,1359,5,39,0,0, - 1359,1360,1,0,0,0,1360,1361,6,173,2,0,1361,350,1,0,0,0,1362,1363,5,39, - 0,0,1363,352,1,0,0,0,1364,1365,5,126,0,0,1365,354,1,0,0,0,1366,1367,5, - 61,0,0,1367,1368,5,126,0,0,1368,356,1,0,0,0,1369,1370,5,125,0,0,1370, - 1371,1,0,0,0,1371,1372,6,177,3,0,1372,358,1,0,0,0,1373,1374,5,93,0,0, - 1374,360,1,0,0,0,1375,1376,5,41,0,0,1376,362,1,0,0,0,1377,1378,5,59,0, - 0,1378,364,1,0,0,0,1379,1380,5,47,0,0,1380,366,1,0,0,0,1381,1382,5,95, - 0,0,1382,368,1,0,0,0,1383,1384,5,47,0,0,1384,1385,5,42,0,0,1385,1389, - 1,0,0,0,1386,1388,9,0,0,0,1387,1386,1,0,0,0,1388,1391,1,0,0,0,1389,1390, - 1,0,0,0,1389,1387,1,0,0,0,1390,1392,1,0,0,0,1391,1389,1,0,0,0,1392,1393, - 5,42,0,0,1393,1394,5,47,0,0,1394,1395,1,0,0,0,1395,1396,6,183,4,0,1396, - 370,1,0,0,0,1397,1398,5,45,0,0,1398,1402,5,45,0,0,1399,1400,5,47,0,0, - 1400,1402,5,47,0,0,1401,1397,1,0,0,0,1401,1399,1,0,0,0,1402,1406,1,0, - 0,0,1403,1405,8,33,0,0,1404,1403,1,0,0,0,1405,1408,1,0,0,0,1406,1404, - 1,0,0,0,1406,1407,1,0,0,0,1407,1410,1,0,0,0,1408,1406,1,0,0,0,1409,1411, - 7,34,0,0,1410,1409,1,0,0,0,1411,1412,1,0,0,0,1412,1413,6,184,4,0,1413, - 372,1,0,0,0,1414,1415,7,35,0,0,1415,1416,1,0,0,0,1416,1417,6,185,5,0, - 1417,374,1,0,0,0,1418,1430,8,36,0,0,1419,1430,3,211,104,0,1420,1421,3, - 291,144,0,1421,1422,3,351,174,0,1422,1430,1,0,0,0,1423,1424,3,291,144, - 0,1424,1425,3,319,158,0,1425,1430,1,0,0,0,1426,1427,3,351,174,0,1427, - 1428,3,351,174,0,1428,1430,1,0,0,0,1429,1418,1,0,0,0,1429,1419,1,0,0, - 0,1429,1420,1,0,0,0,1429,1423,1,0,0,0,1429,1426,1,0,0,0,1430,1431,1,0, - 0,0,1431,1429,1,0,0,0,1431,1432,1,0,0,0,1432,376,1,0,0,0,1433,1434,3, - 319,158,0,1434,1435,1,0,0,0,1435,1436,6,187,0,0,1436,378,1,0,0,0,1437, - 1438,3,351,174,0,1438,1439,1,0,0,0,1439,1440,6,188,6,0,1440,1441,6,188, - 3,0,1441,380,1,0,0,0,1442,1448,8,37,0,0,1443,1448,3,211,104,0,1444,1445, - 3,291,144,0,1445,1446,3,319,158,0,1446,1448,1,0,0,0,1447,1442,1,0,0,0, - 1447,1443,1,0,0,0,1447,1444,1,0,0,0,1448,1449,1,0,0,0,1449,1447,1,0,0, - 0,1449,1450,1,0,0,0,1450,382,1,0,0,0,1451,1452,3,319,158,0,1452,1453, - 1,0,0,0,1453,1454,6,190,0,0,1454,384,1,0,0,0,44,0,1,2,425,646,1020,1049, - 1054,1060,1062,1074,1076,1090,1092,1097,1104,1109,1113,1118,1123,1127, - 1132,1139,1145,1150,1157,1162,1168,1173,1175,1181,1186,1193,1204,1206, - 1329,1389,1401,1406,1410,1429,1431,1447,1449,7,5,0,0,5,1,0,5,2,0,4,0, - 0,6,0,0,0,1,0,7,145,0 + 0,0,0,0,367,1,0,0,0,0,369,1,0,0,0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1, + 0,0,0,0,377,1,0,0,0,1,379,1,0,0,0,1,381,1,0,0,0,1,383,1,0,0,0,2,385,1, + 0,0,0,2,387,1,0,0,0,3,389,1,0,0,0,5,393,1,0,0,0,7,397,1,0,0,0,9,402,1, + 0,0,0,11,406,1,0,0,0,13,412,1,0,0,0,15,429,1,0,0,0,17,431,1,0,0,0,19, + 436,1,0,0,0,21,444,1,0,0,0,23,449,1,0,0,0,25,452,1,0,0,0,27,457,1,0,0, + 0,29,462,1,0,0,0,31,468,1,0,0,0,33,475,1,0,0,0,35,483,1,0,0,0,37,489, + 1,0,0,0,39,494,1,0,0,0,41,502,1,0,0,0,43,507,1,0,0,0,45,511,1,0,0,0,47, + 516,1,0,0,0,49,527,1,0,0,0,51,536,1,0,0,0,53,541,1,0,0,0,55,545,1,0,0, + 0,57,552,1,0,0,0,59,560,1,0,0,0,61,566,1,0,0,0,63,574,1,0,0,0,65,580, + 1,0,0,0,67,583,1,0,0,0,69,593,1,0,0,0,71,597,1,0,0,0,73,602,1,0,0,0,75, + 607,1,0,0,0,77,611,1,0,0,0,79,617,1,0,0,0,81,624,1,0,0,0,83,629,1,0,0, + 0,85,632,1,0,0,0,87,635,1,0,0,0,89,641,1,0,0,0,91,657,1,0,0,0,93,659, + 1,0,0,0,95,665,1,0,0,0,97,675,1,0,0,0,99,684,1,0,0,0,101,687,1,0,0,0, + 103,692,1,0,0,0,105,696,1,0,0,0,107,701,1,0,0,0,109,709,1,0,0,0,111,714, + 1,0,0,0,113,718,1,0,0,0,115,723,1,0,0,0,117,729,1,0,0,0,119,736,1,0,0, + 0,121,742,1,0,0,0,123,746,1,0,0,0,125,750,1,0,0,0,127,755,1,0,0,0,129, + 761,1,0,0,0,131,768,1,0,0,0,133,771,1,0,0,0,135,774,1,0,0,0,137,780,1, + 0,0,0,139,786,1,0,0,0,141,791,1,0,0,0,143,801,1,0,0,0,145,811,1,0,0,0, + 147,820,1,0,0,0,149,828,1,0,0,0,151,834,1,0,0,0,153,841,1,0,0,0,155,847, + 1,0,0,0,157,854,1,0,0,0,159,858,1,0,0,0,161,863,1,0,0,0,163,870,1,0,0, + 0,165,877,1,0,0,0,167,884,1,0,0,0,169,889,1,0,0,0,171,898,1,0,0,0,173, + 908,1,0,0,0,175,913,1,0,0,0,177,919,1,0,0,0,179,924,1,0,0,0,181,934,1, + 0,0,0,183,937,1,0,0,0,185,941,1,0,0,0,187,948,1,0,0,0,189,957,1,0,0,0, + 191,962,1,0,0,0,193,971,1,0,0,0,195,975,1,0,0,0,197,985,1,0,0,0,199,991, + 1,0,0,0,201,997,1,0,0,0,203,1002,1,0,0,0,205,1007,1,0,0,0,207,1013,1, + 0,0,0,209,1019,1,0,0,0,211,1026,1,0,0,0,213,1041,1,0,0,0,215,1070,1,0, + 0,0,217,1118,1,0,0,0,219,1196,1,0,0,0,221,1198,1,0,0,0,223,1205,1,0,0, + 0,225,1209,1,0,0,0,227,1216,1,0,0,0,229,1232,1,0,0,0,231,1234,1,0,0,0, + 233,1236,1,0,0,0,235,1238,1,0,0,0,237,1240,1,0,0,0,239,1242,1,0,0,0,241, + 1244,1,0,0,0,243,1246,1,0,0,0,245,1248,1,0,0,0,247,1250,1,0,0,0,249,1252, + 1,0,0,0,251,1254,1,0,0,0,253,1256,1,0,0,0,255,1258,1,0,0,0,257,1260,1, + 0,0,0,259,1262,1,0,0,0,261,1264,1,0,0,0,263,1266,1,0,0,0,265,1268,1,0, + 0,0,267,1270,1,0,0,0,269,1272,1,0,0,0,271,1274,1,0,0,0,273,1276,1,0,0, + 0,275,1278,1,0,0,0,277,1280,1,0,0,0,279,1282,1,0,0,0,281,1284,1,0,0,0, + 283,1286,1,0,0,0,285,1288,1,0,0,0,287,1290,1,0,0,0,289,1292,1,0,0,0,291, + 1295,1,0,0,0,293,1297,1,0,0,0,295,1299,1,0,0,0,297,1301,1,0,0,0,299,1303, + 1,0,0,0,301,1305,1,0,0,0,303,1308,1,0,0,0,305,1310,1,0,0,0,307,1312,1, + 0,0,0,309,1314,1,0,0,0,311,1317,1,0,0,0,313,1319,1,0,0,0,315,1322,1,0, + 0,0,317,1324,1,0,0,0,319,1326,1,0,0,0,321,1329,1,0,0,0,323,1333,1,0,0, + 0,325,1337,1,0,0,0,327,1339,1,0,0,0,329,1341,1,0,0,0,331,1344,1,0,0,0, + 333,1350,1,0,0,0,335,1352,1,0,0,0,337,1356,1,0,0,0,339,1359,1,0,0,0,341, + 1362,1,0,0,0,343,1365,1,0,0,0,345,1367,1,0,0,0,347,1369,1,0,0,0,349,1371, + 1,0,0,0,351,1373,1,0,0,0,353,1378,1,0,0,0,355,1383,1,0,0,0,357,1385,1, + 0,0,0,359,1387,1,0,0,0,361,1390,1,0,0,0,363,1394,1,0,0,0,365,1396,1,0, + 0,0,367,1398,1,0,0,0,369,1400,1,0,0,0,371,1402,1,0,0,0,373,1404,1,0,0, + 0,375,1422,1,0,0,0,377,1435,1,0,0,0,379,1450,1,0,0,0,381,1454,1,0,0,0, + 383,1458,1,0,0,0,385,1468,1,0,0,0,387,1472,1,0,0,0,389,390,3,229,113, + 0,390,391,3,251,124,0,391,392,3,251,124,0,392,4,1,0,0,0,393,394,3,229, + 113,0,394,395,3,255,126,0,395,396,3,235,116,0,396,6,1,0,0,0,397,398,3, + 229,113,0,398,399,3,255,126,0,399,400,3,267,132,0,400,401,3,245,121,0, + 401,8,1,0,0,0,402,403,3,229,113,0,403,404,3,255,126,0,404,405,3,277,137, + 0,405,10,1,0,0,0,406,407,3,229,113,0,407,408,3,263,130,0,408,409,3,263, + 130,0,409,410,3,229,113,0,410,411,3,277,137,0,411,12,1,0,0,0,412,413, + 3,229,113,0,413,414,3,265,131,0,414,14,1,0,0,0,415,416,3,229,113,0,416, + 417,3,265,131,0,417,418,3,233,115,0,418,430,1,0,0,0,419,420,3,229,113, + 0,420,421,3,265,131,0,421,422,3,233,115,0,422,423,3,237,117,0,423,424, + 3,255,126,0,424,425,3,235,116,0,425,426,3,245,121,0,426,427,3,255,126, + 0,427,428,3,241,119,0,428,430,1,0,0,0,429,415,1,0,0,0,429,419,1,0,0,0, + 430,16,1,0,0,0,431,432,3,229,113,0,432,433,3,265,131,0,433,434,3,257, + 127,0,434,435,3,239,118,0,435,18,1,0,0,0,436,437,3,231,114,0,437,438, + 3,237,117,0,438,439,3,267,132,0,439,440,3,273,135,0,440,441,3,237,117, + 0,441,442,3,237,117,0,442,443,3,255,126,0,443,20,1,0,0,0,444,445,3,231, + 114,0,445,446,3,257,127,0,446,447,3,267,132,0,447,448,3,243,120,0,448, + 22,1,0,0,0,449,450,3,231,114,0,450,451,3,277,137,0,451,24,1,0,0,0,452, + 453,3,233,115,0,453,454,3,229,113,0,454,455,3,265,131,0,455,456,3,237, + 117,0,456,26,1,0,0,0,457,458,3,233,115,0,458,459,3,229,113,0,459,460, + 3,265,131,0,460,461,3,267,132,0,461,28,1,0,0,0,462,463,3,233,115,0,463, + 464,3,229,113,0,464,465,3,267,132,0,465,466,3,233,115,0,466,467,3,243, + 120,0,467,30,1,0,0,0,468,469,3,233,115,0,469,470,3,257,127,0,470,471, + 3,243,120,0,471,472,3,257,127,0,472,473,3,263,130,0,473,474,3,267,132, + 0,474,32,1,0,0,0,475,476,3,233,115,0,476,477,3,257,127,0,477,478,3,251, + 124,0,478,479,3,251,124,0,479,480,3,229,113,0,480,481,3,267,132,0,481, + 482,3,237,117,0,482,34,1,0,0,0,483,484,3,233,115,0,484,485,3,263,130, + 0,485,486,3,257,127,0,486,487,3,265,131,0,487,488,3,265,131,0,488,36, + 1,0,0,0,489,490,3,233,115,0,490,491,3,269,133,0,491,492,3,231,114,0,492, + 493,3,237,117,0,493,38,1,0,0,0,494,495,3,233,115,0,495,496,3,269,133, + 0,496,497,3,263,130,0,497,498,3,263,130,0,498,499,3,237,117,0,499,500, + 3,255,126,0,500,501,3,267,132,0,501,40,1,0,0,0,502,503,3,235,116,0,503, + 504,3,229,113,0,504,505,3,267,132,0,505,506,3,237,117,0,506,42,1,0,0, + 0,507,508,3,235,116,0,508,509,3,229,113,0,509,510,3,277,137,0,510,44, + 1,0,0,0,511,512,3,235,116,0,512,513,3,237,117,0,513,514,3,265,131,0,514, + 515,3,233,115,0,515,46,1,0,0,0,516,517,3,235,116,0,517,518,3,237,117, + 0,518,519,3,265,131,0,519,520,3,233,115,0,520,521,3,237,117,0,521,522, + 3,255,126,0,522,523,3,235,116,0,523,524,3,245,121,0,524,525,3,255,126, + 0,525,526,3,241,119,0,526,48,1,0,0,0,527,528,3,235,116,0,528,529,3,245, + 121,0,529,530,3,265,131,0,530,531,3,267,132,0,531,532,3,245,121,0,532, + 533,3,255,126,0,533,534,3,233,115,0,534,535,3,267,132,0,535,50,1,0,0, + 0,536,537,3,237,117,0,537,538,3,251,124,0,538,539,3,265,131,0,539,540, + 3,237,117,0,540,52,1,0,0,0,541,542,3,237,117,0,542,543,3,255,126,0,543, + 544,3,235,116,0,544,54,1,0,0,0,545,546,3,237,117,0,546,547,3,275,136, + 0,547,548,3,233,115,0,548,549,3,237,117,0,549,550,3,259,128,0,550,551, + 3,267,132,0,551,56,1,0,0,0,552,553,3,237,117,0,553,554,3,275,136,0,554, + 555,3,267,132,0,555,556,3,263,130,0,556,557,3,229,113,0,557,558,3,233, + 115,0,558,559,3,267,132,0,559,58,1,0,0,0,560,561,3,239,118,0,561,562, + 3,245,121,0,562,563,3,255,126,0,563,564,3,229,113,0,564,565,3,251,124, + 0,565,60,1,0,0,0,566,567,3,239,118,0,567,568,3,245,121,0,568,569,3,255, + 126,0,569,570,3,229,113,0,570,571,3,251,124,0,571,572,3,251,124,0,572, + 573,3,277,137,0,573,62,1,0,0,0,574,575,3,239,118,0,575,576,3,245,121, + 0,576,577,3,263,130,0,577,578,3,265,131,0,578,579,3,267,132,0,579,64, + 1,0,0,0,580,581,3,239,118,0,581,582,3,255,126,0,582,66,1,0,0,0,583,584, + 3,239,118,0,584,585,3,257,127,0,585,586,3,251,124,0,586,587,3,251,124, + 0,587,588,3,257,127,0,588,589,3,273,135,0,589,590,3,245,121,0,590,591, + 3,255,126,0,591,592,3,241,119,0,592,68,1,0,0,0,593,594,3,239,118,0,594, + 595,3,257,127,0,595,596,3,263,130,0,596,70,1,0,0,0,597,598,3,239,118, + 0,598,599,3,263,130,0,599,600,3,257,127,0,600,601,3,253,125,0,601,72, + 1,0,0,0,602,603,3,239,118,0,603,604,3,269,133,0,604,605,3,251,124,0,605, + 606,3,251,124,0,606,74,1,0,0,0,607,608,3,239,118,0,608,609,3,269,133, + 0,609,610,3,255,126,0,610,76,1,0,0,0,611,612,3,241,119,0,612,613,3,263, + 130,0,613,614,3,257,127,0,614,615,3,269,133,0,615,616,3,259,128,0,616, + 78,1,0,0,0,617,618,3,243,120,0,618,619,3,229,113,0,619,620,3,271,134, + 0,620,621,3,245,121,0,621,622,3,255,126,0,622,623,3,241,119,0,623,80, + 1,0,0,0,624,625,3,243,120,0,625,626,3,257,127,0,626,627,3,269,133,0,627, + 628,3,263,130,0,628,82,1,0,0,0,629,630,3,245,121,0,630,631,3,235,116, + 0,631,84,1,0,0,0,632,633,3,245,121,0,633,634,3,239,118,0,634,86,1,0,0, + 0,635,636,3,245,121,0,636,637,3,251,124,0,637,638,3,245,121,0,638,639, + 3,249,123,0,639,640,3,237,117,0,640,88,1,0,0,0,641,642,3,245,121,0,642, + 643,3,255,126,0,643,90,1,0,0,0,644,645,3,245,121,0,645,646,3,255,126, + 0,646,647,3,239,118,0,647,658,1,0,0,0,648,649,3,245,121,0,649,650,3,255, + 126,0,650,651,3,239,118,0,651,652,3,245,121,0,652,653,3,255,126,0,653, + 654,3,245,121,0,654,655,3,267,132,0,655,656,3,277,137,0,656,658,1,0,0, + 0,657,644,1,0,0,0,657,648,1,0,0,0,658,92,1,0,0,0,659,660,3,245,121,0, + 660,661,3,255,126,0,661,662,3,255,126,0,662,663,3,237,117,0,663,664,3, + 263,130,0,664,94,1,0,0,0,665,666,3,245,121,0,666,667,3,255,126,0,667, + 668,3,267,132,0,668,669,3,237,117,0,669,670,3,263,130,0,670,671,3,265, + 131,0,671,672,3,237,117,0,672,673,3,233,115,0,673,674,3,267,132,0,674, + 96,1,0,0,0,675,676,3,245,121,0,676,677,3,255,126,0,677,678,3,267,132, + 0,678,679,3,237,117,0,679,680,3,263,130,0,680,681,3,271,134,0,681,682, + 3,229,113,0,682,683,3,251,124,0,683,98,1,0,0,0,684,685,3,245,121,0,685, + 686,3,265,131,0,686,100,1,0,0,0,687,688,3,247,122,0,688,689,3,257,127, + 0,689,690,3,245,121,0,690,691,3,255,126,0,691,102,1,0,0,0,692,693,3,249, + 123,0,693,694,3,237,117,0,694,695,3,277,137,0,695,104,1,0,0,0,696,697, + 3,251,124,0,697,698,3,229,113,0,698,699,3,265,131,0,699,700,3,267,132, + 0,700,106,1,0,0,0,701,702,3,251,124,0,702,703,3,237,117,0,703,704,3,229, + 113,0,704,705,3,235,116,0,705,706,3,245,121,0,706,707,3,255,126,0,707, + 708,3,241,119,0,708,108,1,0,0,0,709,710,3,251,124,0,710,711,3,237,117, + 0,711,712,3,239,118,0,712,713,3,267,132,0,713,110,1,0,0,0,714,715,3,251, + 124,0,715,716,3,237,117,0,716,717,3,267,132,0,717,112,1,0,0,0,718,719, + 3,251,124,0,719,720,3,245,121,0,720,721,3,249,123,0,721,722,3,237,117, + 0,722,114,1,0,0,0,723,724,3,251,124,0,724,725,3,245,121,0,725,726,3,253, + 125,0,726,727,3,245,121,0,727,728,3,267,132,0,728,116,1,0,0,0,729,730, + 3,253,125,0,730,731,3,245,121,0,731,732,3,255,126,0,732,733,3,269,133, + 0,733,734,3,267,132,0,734,735,3,237,117,0,735,118,1,0,0,0,736,737,3,253, + 125,0,737,738,3,257,127,0,738,739,3,255,126,0,739,740,3,267,132,0,740, + 741,3,243,120,0,741,120,1,0,0,0,742,743,3,255,126,0,743,744,3,229,113, + 0,744,745,3,255,126,0,745,122,1,0,0,0,746,747,3,255,126,0,747,748,3,257, + 127,0,748,749,3,267,132,0,749,124,1,0,0,0,750,751,3,255,126,0,751,752, + 3,269,133,0,752,753,3,251,124,0,753,754,3,251,124,0,754,126,1,0,0,0,755, + 756,3,255,126,0,756,757,3,269,133,0,757,758,3,251,124,0,758,759,3,251, + 124,0,759,760,3,265,131,0,760,128,1,0,0,0,761,762,3,257,127,0,762,763, + 3,239,118,0,763,764,3,239,118,0,764,765,3,265,131,0,765,766,3,237,117, + 0,766,767,3,267,132,0,767,130,1,0,0,0,768,769,3,257,127,0,769,770,3,255, + 126,0,770,132,1,0,0,0,771,772,3,257,127,0,772,773,3,263,130,0,773,134, + 1,0,0,0,774,775,3,257,127,0,775,776,3,263,130,0,776,777,3,235,116,0,777, + 778,3,237,117,0,778,779,3,263,130,0,779,136,1,0,0,0,780,781,3,257,127, + 0,781,782,3,269,133,0,782,783,3,267,132,0,783,784,3,237,117,0,784,785, + 3,263,130,0,785,138,1,0,0,0,786,787,3,257,127,0,787,788,3,271,134,0,788, + 789,3,237,117,0,789,790,3,263,130,0,790,140,1,0,0,0,791,792,3,259,128, + 0,792,793,3,229,113,0,793,794,3,263,130,0,794,795,3,267,132,0,795,796, + 3,245,121,0,796,797,3,267,132,0,797,798,3,245,121,0,798,799,3,257,127, + 0,799,800,3,255,126,0,800,142,1,0,0,0,801,802,3,259,128,0,802,803,3,263, + 130,0,803,804,3,237,117,0,804,805,3,233,115,0,805,806,3,237,117,0,806, + 807,3,235,116,0,807,808,3,245,121,0,808,809,3,255,126,0,809,810,3,241, + 119,0,810,144,1,0,0,0,811,812,3,259,128,0,812,813,3,263,130,0,813,814, + 3,237,117,0,814,815,3,273,135,0,815,816,3,243,120,0,816,817,3,237,117, + 0,817,818,3,263,130,0,818,819,3,237,117,0,819,146,1,0,0,0,820,821,3,261, + 129,0,821,822,3,269,133,0,822,823,3,229,113,0,823,824,3,263,130,0,824, + 825,3,267,132,0,825,826,3,237,117,0,826,827,3,263,130,0,827,148,1,0,0, + 0,828,829,3,263,130,0,829,830,3,229,113,0,830,831,3,255,126,0,831,832, + 3,241,119,0,832,833,3,237,117,0,833,150,1,0,0,0,834,835,3,263,130,0,835, + 836,3,237,117,0,836,837,3,267,132,0,837,838,3,269,133,0,838,839,3,263, + 130,0,839,840,3,255,126,0,840,152,1,0,0,0,841,842,3,263,130,0,842,843, + 3,245,121,0,843,844,3,241,119,0,844,845,3,243,120,0,845,846,3,267,132, + 0,846,154,1,0,0,0,847,848,3,263,130,0,848,849,3,257,127,0,849,850,3,251, + 124,0,850,851,3,251,124,0,851,852,3,269,133,0,852,853,3,259,128,0,853, + 156,1,0,0,0,854,855,3,263,130,0,855,856,3,257,127,0,856,857,3,273,135, + 0,857,158,1,0,0,0,858,859,3,263,130,0,859,860,3,257,127,0,860,861,3,273, + 135,0,861,862,3,265,131,0,862,160,1,0,0,0,863,864,3,265,131,0,864,865, + 3,229,113,0,865,866,3,253,125,0,866,867,3,259,128,0,867,868,3,251,124, + 0,868,869,3,237,117,0,869,162,1,0,0,0,870,871,3,265,131,0,871,872,3,237, + 117,0,872,873,3,233,115,0,873,874,3,257,127,0,874,875,3,255,126,0,875, + 876,3,235,116,0,876,164,1,0,0,0,877,878,3,265,131,0,878,879,3,237,117, + 0,879,880,3,251,124,0,880,881,3,237,117,0,881,882,3,233,115,0,882,883, + 3,267,132,0,883,166,1,0,0,0,884,885,3,265,131,0,885,886,3,237,117,0,886, + 887,3,253,125,0,887,888,3,245,121,0,888,168,1,0,0,0,889,890,3,265,131, + 0,890,891,3,237,117,0,891,892,3,267,132,0,892,893,3,267,132,0,893,894, + 3,245,121,0,894,895,3,255,126,0,895,896,3,241,119,0,896,897,3,265,131, + 0,897,170,1,0,0,0,898,899,3,265,131,0,899,900,3,269,133,0,900,901,3,231, + 114,0,901,902,3,265,131,0,902,903,3,267,132,0,903,904,3,263,130,0,904, + 905,3,245,121,0,905,906,3,255,126,0,906,907,3,241,119,0,907,172,1,0,0, + 0,908,909,3,267,132,0,909,910,3,243,120,0,910,911,3,237,117,0,911,912, + 3,255,126,0,912,174,1,0,0,0,913,914,3,267,132,0,914,915,3,243,120,0,915, + 916,3,263,130,0,916,917,3,257,127,0,917,918,3,273,135,0,918,176,1,0,0, + 0,919,920,3,267,132,0,920,921,3,245,121,0,921,922,3,237,117,0,922,923, + 3,265,131,0,923,178,1,0,0,0,924,925,3,267,132,0,925,926,3,245,121,0,926, + 927,3,253,125,0,927,928,3,237,117,0,928,929,3,265,131,0,929,930,3,267, + 132,0,930,931,3,229,113,0,931,932,3,253,125,0,932,933,3,259,128,0,933, + 180,1,0,0,0,934,935,3,267,132,0,935,936,3,257,127,0,936,182,1,0,0,0,937, + 938,3,267,132,0,938,939,3,257,127,0,939,940,3,259,128,0,940,184,1,0,0, + 0,941,942,3,267,132,0,942,943,3,257,127,0,943,944,3,267,132,0,944,945, + 3,229,113,0,945,946,3,251,124,0,946,947,3,265,131,0,947,186,1,0,0,0,948, + 949,3,267,132,0,949,950,3,263,130,0,950,951,3,229,113,0,951,952,3,245, + 121,0,952,953,3,251,124,0,953,954,3,245,121,0,954,955,3,255,126,0,955, + 956,3,241,119,0,956,188,1,0,0,0,957,958,3,267,132,0,958,959,3,263,130, + 0,959,960,3,245,121,0,960,961,3,253,125,0,961,190,1,0,0,0,962,963,3,267, + 132,0,963,964,3,263,130,0,964,965,3,269,133,0,965,966,3,255,126,0,966, + 967,3,233,115,0,967,968,3,229,113,0,968,969,3,267,132,0,969,970,3,237, + 117,0,970,192,1,0,0,0,971,972,3,267,132,0,972,973,3,263,130,0,973,974, + 3,277,137,0,974,194,1,0,0,0,975,976,3,269,133,0,976,977,3,255,126,0,977, + 978,3,231,114,0,978,979,3,257,127,0,979,980,3,269,133,0,980,981,3,255, + 126,0,981,982,3,235,116,0,982,983,3,237,117,0,983,984,3,235,116,0,984, + 196,1,0,0,0,985,986,3,269,133,0,986,987,3,255,126,0,987,988,3,245,121, + 0,988,989,3,257,127,0,989,990,3,255,126,0,990,198,1,0,0,0,991,992,3,269, + 133,0,992,993,3,265,131,0,993,994,3,245,121,0,994,995,3,255,126,0,995, + 996,3,241,119,0,996,200,1,0,0,0,997,998,3,273,135,0,998,999,3,237,117, + 0,999,1000,3,237,117,0,1000,1001,3,249,123,0,1001,202,1,0,0,0,1002,1003, + 3,273,135,0,1003,1004,3,243,120,0,1004,1005,3,237,117,0,1005,1006,3,255, + 126,0,1006,204,1,0,0,0,1007,1008,3,273,135,0,1008,1009,3,243,120,0,1009, + 1010,3,237,117,0,1010,1011,3,263,130,0,1011,1012,3,237,117,0,1012,206, + 1,0,0,0,1013,1014,3,273,135,0,1014,1015,3,243,120,0,1015,1016,3,245,121, + 0,1016,1017,3,251,124,0,1017,1018,3,237,117,0,1018,208,1,0,0,0,1019,1020, + 3,273,135,0,1020,1021,3,245,121,0,1021,1022,3,255,126,0,1022,1023,3,235, + 116,0,1023,1024,3,257,127,0,1024,1025,3,273,135,0,1025,210,1,0,0,0,1026, + 1027,3,273,135,0,1027,1028,3,245,121,0,1028,1029,3,267,132,0,1029,1030, + 3,243,120,0,1030,212,1,0,0,0,1031,1032,3,277,137,0,1032,1033,3,237,117, + 0,1033,1034,3,229,113,0,1034,1035,3,263,130,0,1035,1042,1,0,0,0,1036, + 1037,3,277,137,0,1037,1038,3,277,137,0,1038,1039,3,277,137,0,1039,1040, + 3,277,137,0,1040,1042,1,0,0,0,1041,1031,1,0,0,0,1041,1036,1,0,0,0,1042, + 214,1,0,0,0,1043,1044,3,295,146,0,1044,1045,3,231,114,0,1045,1071,1,0, + 0,0,1046,1047,3,295,146,0,1047,1048,3,239,118,0,1048,1071,1,0,0,0,1049, + 1050,3,295,146,0,1050,1051,3,263,130,0,1051,1071,1,0,0,0,1052,1053,3, + 295,146,0,1053,1054,3,255,126,0,1054,1071,1,0,0,0,1055,1056,3,295,146, + 0,1056,1057,3,267,132,0,1057,1071,1,0,0,0,1058,1059,3,295,146,0,1059, + 1060,5,48,0,0,1060,1071,1,0,0,0,1061,1062,3,295,146,0,1062,1063,3,229, + 113,0,1063,1071,1,0,0,0,1064,1065,3,295,146,0,1065,1066,3,271,134,0,1066, + 1071,1,0,0,0,1067,1068,3,295,146,0,1068,1069,3,295,146,0,1069,1071,1, + 0,0,0,1070,1043,1,0,0,0,1070,1046,1,0,0,0,1070,1049,1,0,0,0,1070,1052, + 1,0,0,0,1070,1055,1,0,0,0,1070,1058,1,0,0,0,1070,1061,1,0,0,0,1070,1064, + 1,0,0,0,1070,1067,1,0,0,0,1071,216,1,0,0,0,1072,1076,3,281,139,0,1073, + 1076,3,371,184,0,1074,1076,3,305,151,0,1075,1072,1,0,0,0,1075,1073,1, + 0,0,0,1075,1074,1,0,0,0,1076,1083,1,0,0,0,1077,1082,3,281,139,0,1078, + 1082,3,371,184,0,1079,1082,3,285,141,0,1080,1082,3,305,151,0,1081,1077, + 1,0,0,0,1081,1078,1,0,0,0,1081,1079,1,0,0,0,1081,1080,1,0,0,0,1082,1085, + 1,0,0,0,1083,1081,1,0,0,0,1083,1084,1,0,0,0,1084,1119,1,0,0,0,1085,1083, + 1,0,0,0,1086,1097,3,293,145,0,1087,1096,8,0,0,0,1088,1096,3,215,106,0, + 1089,1090,3,295,146,0,1090,1091,3,355,176,0,1091,1096,1,0,0,0,1092,1093, + 3,293,145,0,1093,1094,3,293,145,0,1094,1096,1,0,0,0,1095,1087,1,0,0,0, + 1095,1088,1,0,0,0,1095,1089,1,0,0,0,1095,1092,1,0,0,0,1096,1099,1,0,0, + 0,1097,1095,1,0,0,0,1097,1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097,1,0, + 0,0,1100,1101,3,293,145,0,1101,1119,1,0,0,0,1102,1113,3,349,173,0,1103, + 1112,8,1,0,0,1104,1112,3,215,106,0,1105,1106,3,295,146,0,1106,1107,3, + 349,173,0,1107,1112,1,0,0,0,1108,1109,3,349,173,0,1109,1110,3,349,173, + 0,1110,1112,1,0,0,0,1111,1103,1,0,0,0,1111,1104,1,0,0,0,1111,1105,1,0, + 0,0,1111,1108,1,0,0,0,1112,1115,1,0,0,0,1113,1111,1,0,0,0,1113,1114,1, + 0,0,0,1114,1116,1,0,0,0,1115,1113,1,0,0,0,1116,1117,3,349,173,0,1117, + 1119,1,0,0,0,1118,1075,1,0,0,0,1118,1086,1,0,0,0,1118,1102,1,0,0,0,1119, + 218,1,0,0,0,1120,1121,3,225,111,0,1121,1125,3,307,152,0,1122,1124,3,287, + 142,0,1123,1122,1,0,0,0,1124,1127,1,0,0,0,1125,1123,1,0,0,0,1125,1126, + 1,0,0,0,1126,1130,1,0,0,0,1127,1125,1,0,0,0,1128,1131,3,259,128,0,1129, + 1131,3,237,117,0,1130,1128,1,0,0,0,1130,1129,1,0,0,0,1131,1134,1,0,0, + 0,1132,1135,3,345,171,0,1133,1135,3,303,150,0,1134,1132,1,0,0,0,1134, + 1133,1,0,0,0,1134,1135,1,0,0,0,1135,1137,1,0,0,0,1136,1138,3,285,141, + 0,1137,1136,1,0,0,0,1138,1139,1,0,0,0,1139,1137,1,0,0,0,1139,1140,1,0, + 0,0,1140,1197,1,0,0,0,1141,1144,3,225,111,0,1142,1145,3,259,128,0,1143, + 1145,3,237,117,0,1144,1142,1,0,0,0,1144,1143,1,0,0,0,1145,1148,1,0,0, + 0,1146,1149,3,345,171,0,1147,1149,3,303,150,0,1148,1146,1,0,0,0,1148, + 1147,1,0,0,0,1148,1149,1,0,0,0,1149,1151,1,0,0,0,1150,1152,3,285,141, + 0,1151,1150,1,0,0,0,1152,1153,1,0,0,0,1153,1151,1,0,0,0,1153,1154,1,0, + 0,0,1154,1197,1,0,0,0,1155,1156,3,223,110,0,1156,1160,3,307,152,0,1157, + 1159,3,285,141,0,1158,1157,1,0,0,0,1159,1162,1,0,0,0,1160,1158,1,0,0, + 0,1160,1161,1,0,0,0,1161,1163,1,0,0,0,1162,1160,1,0,0,0,1163,1166,3,237, + 117,0,1164,1167,3,345,171,0,1165,1167,3,303,150,0,1166,1164,1,0,0,0,1166, + 1165,1,0,0,0,1166,1167,1,0,0,0,1167,1169,1,0,0,0,1168,1170,3,285,141, + 0,1169,1168,1,0,0,0,1170,1171,1,0,0,0,1171,1169,1,0,0,0,1171,1172,1,0, + 0,0,1172,1197,1,0,0,0,1173,1174,3,307,152,0,1174,1175,3,223,110,0,1175, + 1178,3,237,117,0,1176,1179,3,345,171,0,1177,1179,3,303,150,0,1178,1176, + 1,0,0,0,1178,1177,1,0,0,0,1178,1179,1,0,0,0,1179,1181,1,0,0,0,1180,1182, + 3,285,141,0,1181,1180,1,0,0,0,1182,1183,1,0,0,0,1183,1181,1,0,0,0,1183, + 1184,1,0,0,0,1184,1197,1,0,0,0,1185,1186,3,223,110,0,1186,1189,3,237, + 117,0,1187,1190,3,345,171,0,1188,1190,3,303,150,0,1189,1187,1,0,0,0,1189, + 1188,1,0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1193,3,285,141, + 0,1192,1191,1,0,0,0,1193,1194,1,0,0,0,1194,1192,1,0,0,0,1194,1195,1,0, + 0,0,1195,1197,1,0,0,0,1196,1120,1,0,0,0,1196,1141,1,0,0,0,1196,1155,1, + 0,0,0,1196,1173,1,0,0,0,1196,1185,1,0,0,0,1197,220,1,0,0,0,1198,1200, + 5,48,0,0,1199,1201,3,283,140,0,1200,1199,1,0,0,0,1201,1202,1,0,0,0,1202, + 1200,1,0,0,0,1202,1203,1,0,0,0,1203,222,1,0,0,0,1204,1206,3,285,141,0, + 1205,1204,1,0,0,0,1206,1207,1,0,0,0,1207,1205,1,0,0,0,1207,1208,1,0,0, + 0,1208,224,1,0,0,0,1209,1210,5,48,0,0,1210,1212,3,275,136,0,1211,1213, + 3,287,142,0,1212,1211,1,0,0,0,1213,1214,1,0,0,0,1214,1212,1,0,0,0,1214, + 1215,1,0,0,0,1215,226,1,0,0,0,1216,1227,3,355,176,0,1217,1226,8,2,0,0, + 1218,1226,3,215,106,0,1219,1220,3,295,146,0,1220,1221,3,355,176,0,1221, + 1226,1,0,0,0,1222,1223,3,355,176,0,1223,1224,3,355,176,0,1224,1226,1, + 0,0,0,1225,1217,1,0,0,0,1225,1218,1,0,0,0,1225,1219,1,0,0,0,1225,1222, + 1,0,0,0,1226,1229,1,0,0,0,1227,1225,1,0,0,0,1227,1228,1,0,0,0,1228,1230, + 1,0,0,0,1229,1227,1,0,0,0,1230,1231,3,355,176,0,1231,228,1,0,0,0,1232, + 1233,7,3,0,0,1233,230,1,0,0,0,1234,1235,7,4,0,0,1235,232,1,0,0,0,1236, + 1237,7,5,0,0,1237,234,1,0,0,0,1238,1239,7,6,0,0,1239,236,1,0,0,0,1240, + 1241,7,7,0,0,1241,238,1,0,0,0,1242,1243,7,8,0,0,1243,240,1,0,0,0,1244, + 1245,7,9,0,0,1245,242,1,0,0,0,1246,1247,7,10,0,0,1247,244,1,0,0,0,1248, + 1249,7,11,0,0,1249,246,1,0,0,0,1250,1251,7,12,0,0,1251,248,1,0,0,0,1252, + 1253,7,13,0,0,1253,250,1,0,0,0,1254,1255,7,14,0,0,1255,252,1,0,0,0,1256, + 1257,7,15,0,0,1257,254,1,0,0,0,1258,1259,7,16,0,0,1259,256,1,0,0,0,1260, + 1261,7,17,0,0,1261,258,1,0,0,0,1262,1263,7,18,0,0,1263,260,1,0,0,0,1264, + 1265,7,19,0,0,1265,262,1,0,0,0,1266,1267,7,20,0,0,1267,264,1,0,0,0,1268, + 1269,7,21,0,0,1269,266,1,0,0,0,1270,1271,7,22,0,0,1271,268,1,0,0,0,1272, + 1273,7,23,0,0,1273,270,1,0,0,0,1274,1275,7,24,0,0,1275,272,1,0,0,0,1276, + 1277,7,25,0,0,1277,274,1,0,0,0,1278,1279,7,26,0,0,1279,276,1,0,0,0,1280, + 1281,7,27,0,0,1281,278,1,0,0,0,1282,1283,7,28,0,0,1283,280,1,0,0,0,1284, + 1285,7,29,0,0,1285,282,1,0,0,0,1286,1287,7,30,0,0,1287,284,1,0,0,0,1288, + 1289,7,31,0,0,1289,286,1,0,0,0,1290,1291,7,32,0,0,1291,288,1,0,0,0,1292, + 1293,5,45,0,0,1293,1294,5,62,0,0,1294,290,1,0,0,0,1295,1296,5,42,0,0, + 1296,292,1,0,0,0,1297,1298,5,96,0,0,1298,294,1,0,0,0,1299,1300,5,92,0, + 0,1300,296,1,0,0,0,1301,1302,5,58,0,0,1302,298,1,0,0,0,1303,1304,5,44, + 0,0,1304,300,1,0,0,0,1305,1306,5,124,0,0,1306,1307,5,124,0,0,1307,302, + 1,0,0,0,1308,1309,5,45,0,0,1309,304,1,0,0,0,1310,1311,5,36,0,0,1311,306, + 1,0,0,0,1312,1313,5,46,0,0,1313,308,1,0,0,0,1314,1315,5,61,0,0,1315,1316, + 5,61,0,0,1316,310,1,0,0,0,1317,1318,5,61,0,0,1318,312,1,0,0,0,1319,1320, + 5,62,0,0,1320,1321,5,61,0,0,1321,314,1,0,0,0,1322,1323,5,62,0,0,1323, + 316,1,0,0,0,1324,1325,5,35,0,0,1325,318,1,0,0,0,1326,1327,5,126,0,0,1327, + 1328,5,42,0,0,1328,320,1,0,0,0,1329,1330,5,61,0,0,1330,1331,5,126,0,0, + 1331,1332,5,42,0,0,1332,322,1,0,0,0,1333,1334,5,123,0,0,1334,1335,1,0, + 0,0,1335,1336,6,160,0,0,1336,324,1,0,0,0,1337,1338,5,91,0,0,1338,326, + 1,0,0,0,1339,1340,5,40,0,0,1340,328,1,0,0,0,1341,1342,5,60,0,0,1342,1343, + 5,61,0,0,1343,330,1,0,0,0,1344,1345,5,60,0,0,1345,332,1,0,0,0,1346,1347, + 5,33,0,0,1347,1351,5,61,0,0,1348,1349,5,60,0,0,1349,1351,5,62,0,0,1350, + 1346,1,0,0,0,1350,1348,1,0,0,0,1351,334,1,0,0,0,1352,1353,5,33,0,0,1353, + 1354,5,126,0,0,1354,1355,5,42,0,0,1355,336,1,0,0,0,1356,1357,5,33,0,0, + 1357,1358,5,126,0,0,1358,338,1,0,0,0,1359,1360,5,63,0,0,1360,1361,5,46, + 0,0,1361,340,1,0,0,0,1362,1363,5,63,0,0,1363,1364,5,63,0,0,1364,342,1, + 0,0,0,1365,1366,5,37,0,0,1366,344,1,0,0,0,1367,1368,5,43,0,0,1368,346, + 1,0,0,0,1369,1370,5,63,0,0,1370,348,1,0,0,0,1371,1372,5,34,0,0,1372,350, + 1,0,0,0,1373,1374,5,102,0,0,1374,1375,5,39,0,0,1375,1376,1,0,0,0,1376, + 1377,6,174,1,0,1377,352,1,0,0,0,1378,1379,5,70,0,0,1379,1380,5,39,0,0, + 1380,1381,1,0,0,0,1381,1382,6,175,2,0,1382,354,1,0,0,0,1383,1384,5,39, + 0,0,1384,356,1,0,0,0,1385,1386,5,126,0,0,1386,358,1,0,0,0,1387,1388,5, + 61,0,0,1388,1389,5,126,0,0,1389,360,1,0,0,0,1390,1391,5,125,0,0,1391, + 1392,1,0,0,0,1392,1393,6,179,3,0,1393,362,1,0,0,0,1394,1395,5,93,0,0, + 1395,364,1,0,0,0,1396,1397,5,41,0,0,1397,366,1,0,0,0,1398,1399,5,59,0, + 0,1399,368,1,0,0,0,1400,1401,5,47,0,0,1401,370,1,0,0,0,1402,1403,5,95, + 0,0,1403,372,1,0,0,0,1404,1405,5,47,0,0,1405,1406,5,42,0,0,1406,1410, + 1,0,0,0,1407,1409,9,0,0,0,1408,1407,1,0,0,0,1409,1412,1,0,0,0,1410,1411, + 1,0,0,0,1410,1408,1,0,0,0,1411,1413,1,0,0,0,1412,1410,1,0,0,0,1413,1414, + 5,42,0,0,1414,1415,5,47,0,0,1415,1416,1,0,0,0,1416,1417,6,185,4,0,1417, + 374,1,0,0,0,1418,1419,5,45,0,0,1419,1423,5,45,0,0,1420,1421,5,47,0,0, + 1421,1423,5,47,0,0,1422,1418,1,0,0,0,1422,1420,1,0,0,0,1423,1427,1,0, + 0,0,1424,1426,8,33,0,0,1425,1424,1,0,0,0,1426,1429,1,0,0,0,1427,1425, + 1,0,0,0,1427,1428,1,0,0,0,1428,1431,1,0,0,0,1429,1427,1,0,0,0,1430,1432, + 7,34,0,0,1431,1430,1,0,0,0,1432,1433,1,0,0,0,1433,1434,6,186,4,0,1434, + 376,1,0,0,0,1435,1436,7,35,0,0,1436,1437,1,0,0,0,1437,1438,6,187,5,0, + 1438,378,1,0,0,0,1439,1451,8,36,0,0,1440,1451,3,215,106,0,1441,1442,3, + 295,146,0,1442,1443,3,355,176,0,1443,1451,1,0,0,0,1444,1445,3,295,146, + 0,1445,1446,3,323,160,0,1446,1451,1,0,0,0,1447,1448,3,355,176,0,1448, + 1449,3,355,176,0,1449,1451,1,0,0,0,1450,1439,1,0,0,0,1450,1440,1,0,0, + 0,1450,1441,1,0,0,0,1450,1444,1,0,0,0,1450,1447,1,0,0,0,1451,1452,1,0, + 0,0,1452,1450,1,0,0,0,1452,1453,1,0,0,0,1453,380,1,0,0,0,1454,1455,3, + 323,160,0,1455,1456,1,0,0,0,1456,1457,6,189,0,0,1457,382,1,0,0,0,1458, + 1459,3,355,176,0,1459,1460,1,0,0,0,1460,1461,6,190,6,0,1461,1462,6,190, + 3,0,1462,384,1,0,0,0,1463,1469,8,37,0,0,1464,1469,3,215,106,0,1465,1466, + 3,295,146,0,1466,1467,3,323,160,0,1467,1469,1,0,0,0,1468,1463,1,0,0,0, + 1468,1464,1,0,0,0,1468,1465,1,0,0,0,1469,1470,1,0,0,0,1470,1468,1,0,0, + 0,1470,1471,1,0,0,0,1471,386,1,0,0,0,1472,1473,3,323,160,0,1473,1474, + 1,0,0,0,1474,1475,6,192,0,0,1475,388,1,0,0,0,44,0,1,2,429,657,1041,1070, + 1075,1081,1083,1095,1097,1111,1113,1118,1125,1130,1134,1139,1144,1148, + 1153,1160,1166,1171,1178,1183,1189,1194,1196,1202,1207,1214,1225,1227, + 1350,1410,1422,1427,1431,1450,1452,1468,1470,7,5,0,0,5,1,0,5,2,0,4,0, + 0,6,0,0,0,1,0,7,147,0 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); diff --git a/hogql_parser/HogQLLexer.h b/hogql_parser/HogQLLexer.h index bb58a9f4db1d1..243379314630a 100644 --- a/hogql_parser/HogQLLexer.h +++ b/hogql_parser/HogQLLexer.h @@ -16,32 +16,33 @@ class HogQLLexer : public antlr4::Lexer { ASOF = 8, BETWEEN = 9, BOTH = 10, BY = 11, CASE = 12, CAST = 13, CATCH = 14, COHORT = 15, COLLATE = 16, CROSS = 17, CUBE = 18, CURRENT = 19, DATE = 20, DAY = 21, DESC = 22, DESCENDING = 23, DISTINCT = 24, ELSE = 25, END = 26, - EXTRACT = 27, FINAL = 28, FINALLY = 29, FIRST = 30, FN = 31, FOLLOWING = 32, - FOR = 33, FROM = 34, FULL = 35, FUN = 36, GROUP = 37, HAVING = 38, HOUR = 39, - ID = 40, IF = 41, ILIKE = 42, IN = 43, INF = 44, INNER = 45, INTERVAL = 46, - IS = 47, JOIN = 48, KEY = 49, LAST = 50, LEADING = 51, LEFT = 52, LET = 53, - LIKE = 54, LIMIT = 55, MINUTE = 56, MONTH = 57, NAN_SQL = 58, NOT = 59, - NULL_SQL = 60, NULLS = 61, OFFSET = 62, ON = 63, OR = 64, ORDER = 65, - OUTER = 66, OVER = 67, PARTITION = 68, PRECEDING = 69, PREWHERE = 70, - QUARTER = 71, RANGE = 72, RETURN = 73, RIGHT = 74, ROLLUP = 75, ROW = 76, - ROWS = 77, SAMPLE = 78, SECOND = 79, SELECT = 80, SEMI = 81, SETTINGS = 82, - SUBSTRING = 83, THEN = 84, THROW = 85, TIES = 86, TIMESTAMP = 87, TO = 88, - TOP = 89, TOTALS = 90, TRAILING = 91, TRIM = 92, TRUNCATE = 93, TRY = 94, - UNBOUNDED = 95, UNION = 96, USING = 97, WEEK = 98, WHEN = 99, WHERE = 100, - WHILE = 101, WINDOW = 102, WITH = 103, YEAR = 104, ESCAPE_CHAR_COMMON = 105, - IDENTIFIER = 106, FLOATING_LITERAL = 107, OCTAL_LITERAL = 108, DECIMAL_LITERAL = 109, - HEXADECIMAL_LITERAL = 110, STRING_LITERAL = 111, ARROW = 112, ASTERISK = 113, - BACKQUOTE = 114, BACKSLASH = 115, COLON = 116, COMMA = 117, CONCAT = 118, - DASH = 119, DOLLAR = 120, DOT = 121, EQ_DOUBLE = 122, EQ_SINGLE = 123, - GT_EQ = 124, GT = 125, HASH = 126, IREGEX_SINGLE = 127, IREGEX_DOUBLE = 128, - LBRACE = 129, LBRACKET = 130, LPAREN = 131, LT_EQ = 132, LT = 133, NOT_EQ = 134, - NOT_IREGEX = 135, NOT_REGEX = 136, NULL_PROPERTY = 137, NULLISH = 138, - PERCENT = 139, PLUS = 140, QUERY = 141, QUOTE_DOUBLE = 142, QUOTE_SINGLE_TEMPLATE = 143, - QUOTE_SINGLE_TEMPLATE_FULL = 144, QUOTE_SINGLE = 145, REGEX_SINGLE = 146, - REGEX_DOUBLE = 147, RBRACE = 148, RBRACKET = 149, RPAREN = 150, SEMICOLON = 151, - SLASH = 152, UNDERSCORE = 153, MULTI_LINE_COMMENT = 154, SINGLE_LINE_COMMENT = 155, - WHITESPACE = 156, STRING_TEXT = 157, STRING_ESCAPE_TRIGGER = 158, FULL_STRING_TEXT = 159, - FULL_STRING_ESCAPE_TRIGGER = 160 + EXCEPT = 27, EXTRACT = 28, FINAL = 29, FINALLY = 30, FIRST = 31, FN = 32, + FOLLOWING = 33, FOR = 34, FROM = 35, FULL = 36, FUN = 37, GROUP = 38, + HAVING = 39, HOUR = 40, ID = 41, IF = 42, ILIKE = 43, IN = 44, INF = 45, + INNER = 46, INTERSECT = 47, INTERVAL = 48, IS = 49, JOIN = 50, KEY = 51, + LAST = 52, LEADING = 53, LEFT = 54, LET = 55, LIKE = 56, LIMIT = 57, + MINUTE = 58, MONTH = 59, NAN_SQL = 60, NOT = 61, NULL_SQL = 62, NULLS = 63, + OFFSET = 64, ON = 65, OR = 66, ORDER = 67, OUTER = 68, OVER = 69, PARTITION = 70, + PRECEDING = 71, PREWHERE = 72, QUARTER = 73, RANGE = 74, RETURN = 75, + RIGHT = 76, ROLLUP = 77, ROW = 78, ROWS = 79, SAMPLE = 80, SECOND = 81, + SELECT = 82, SEMI = 83, SETTINGS = 84, SUBSTRING = 85, THEN = 86, THROW = 87, + TIES = 88, TIMESTAMP = 89, TO = 90, TOP = 91, TOTALS = 92, TRAILING = 93, + TRIM = 94, TRUNCATE = 95, TRY = 96, UNBOUNDED = 97, UNION = 98, USING = 99, + WEEK = 100, WHEN = 101, WHERE = 102, WHILE = 103, WINDOW = 104, WITH = 105, + YEAR = 106, ESCAPE_CHAR_COMMON = 107, IDENTIFIER = 108, FLOATING_LITERAL = 109, + OCTAL_LITERAL = 110, DECIMAL_LITERAL = 111, HEXADECIMAL_LITERAL = 112, + STRING_LITERAL = 113, ARROW = 114, ASTERISK = 115, BACKQUOTE = 116, + BACKSLASH = 117, COLON = 118, COMMA = 119, CONCAT = 120, DASH = 121, + DOLLAR = 122, DOT = 123, EQ_DOUBLE = 124, EQ_SINGLE = 125, GT_EQ = 126, + GT = 127, HASH = 128, IREGEX_SINGLE = 129, IREGEX_DOUBLE = 130, LBRACE = 131, + LBRACKET = 132, LPAREN = 133, LT_EQ = 134, LT = 135, NOT_EQ = 136, NOT_IREGEX = 137, + NOT_REGEX = 138, NULL_PROPERTY = 139, NULLISH = 140, PERCENT = 141, + PLUS = 142, QUERY = 143, QUOTE_DOUBLE = 144, QUOTE_SINGLE_TEMPLATE = 145, + QUOTE_SINGLE_TEMPLATE_FULL = 146, QUOTE_SINGLE = 147, REGEX_SINGLE = 148, + REGEX_DOUBLE = 149, RBRACE = 150, RBRACKET = 151, RPAREN = 152, SEMICOLON = 153, + SLASH = 154, UNDERSCORE = 155, MULTI_LINE_COMMENT = 156, SINGLE_LINE_COMMENT = 157, + WHITESPACE = 158, STRING_TEXT = 159, STRING_ESCAPE_TRIGGER = 160, FULL_STRING_TEXT = 161, + FULL_STRING_ESCAPE_TRIGGER = 162 }; enum { diff --git a/hogql_parser/HogQLLexer.interp b/hogql_parser/HogQLLexer.interp index dc4c26657342d..f461a8e011b30 100644 --- a/hogql_parser/HogQLLexer.interp +++ b/hogql_parser/HogQLLexer.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -351,6 +355,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -370,6 +375,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -527,4 +533,4 @@ IN_TEMPLATE_STRING IN_FULL_TEMPLATE_STRING atn: -[4, 0, 160, 1455, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 426, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 647, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1021, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1050, 8, 104, 1, 105, 1, 105, 1, 105, 3, 105, 1055, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1061, 8, 105, 10, 105, 12, 105, 1064, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1075, 8, 105, 10, 105, 12, 105, 1078, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1091, 8, 105, 10, 105, 12, 105, 1094, 9, 105, 1, 105, 1, 105, 3, 105, 1098, 8, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1103, 8, 106, 10, 106, 12, 106, 1106, 9, 106, 1, 106, 1, 106, 3, 106, 1110, 8, 106, 1, 106, 1, 106, 3, 106, 1114, 8, 106, 1, 106, 4, 106, 1117, 8, 106, 11, 106, 12, 106, 1118, 1, 106, 1, 106, 1, 106, 3, 106, 1124, 8, 106, 1, 106, 1, 106, 3, 106, 1128, 8, 106, 1, 106, 4, 106, 1131, 8, 106, 11, 106, 12, 106, 1132, 1, 106, 1, 106, 1, 106, 5, 106, 1138, 8, 106, 10, 106, 12, 106, 1141, 9, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1146, 8, 106, 1, 106, 4, 106, 1149, 8, 106, 11, 106, 12, 106, 1150, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1158, 8, 106, 1, 106, 4, 106, 1161, 8, 106, 11, 106, 12, 106, 1162, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1169, 8, 106, 1, 106, 4, 106, 1172, 8, 106, 11, 106, 12, 106, 1173, 3, 106, 1176, 8, 106, 1, 107, 1, 107, 4, 107, 1180, 8, 107, 11, 107, 12, 107, 1181, 1, 108, 4, 108, 1185, 8, 108, 11, 108, 12, 108, 1186, 1, 109, 1, 109, 1, 109, 4, 109, 1192, 8, 109, 11, 109, 12, 109, 1193, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1205, 8, 110, 10, 110, 12, 110, 1208, 9, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 3, 163, 1330, 8, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 5, 183, 1388, 8, 183, 10, 183, 12, 183, 1391, 9, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 1402, 8, 184, 1, 184, 5, 184, 1405, 8, 184, 10, 184, 12, 184, 1408, 9, 184, 1, 184, 3, 184, 1411, 8, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 4, 186, 1430, 8, 186, 11, 186, 12, 186, 1431, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 4, 189, 1448, 8, 189, 11, 189, 12, 189, 1449, 1, 190, 1, 190, 1, 190, 1, 190, 1, 1389, 0, 191, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 112, 287, 113, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 0, 381, 159, 383, 160, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1491, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 1, 375, 1, 0, 0, 0, 1, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 2, 381, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 3, 385, 1, 0, 0, 0, 5, 389, 1, 0, 0, 0, 7, 393, 1, 0, 0, 0, 9, 398, 1, 0, 0, 0, 11, 402, 1, 0, 0, 0, 13, 408, 1, 0, 0, 0, 15, 425, 1, 0, 0, 0, 17, 427, 1, 0, 0, 0, 19, 432, 1, 0, 0, 0, 21, 440, 1, 0, 0, 0, 23, 445, 1, 0, 0, 0, 25, 448, 1, 0, 0, 0, 27, 453, 1, 0, 0, 0, 29, 458, 1, 0, 0, 0, 31, 464, 1, 0, 0, 0, 33, 471, 1, 0, 0, 0, 35, 479, 1, 0, 0, 0, 37, 485, 1, 0, 0, 0, 39, 490, 1, 0, 0, 0, 41, 498, 1, 0, 0, 0, 43, 503, 1, 0, 0, 0, 45, 507, 1, 0, 0, 0, 47, 512, 1, 0, 0, 0, 49, 523, 1, 0, 0, 0, 51, 532, 1, 0, 0, 0, 53, 537, 1, 0, 0, 0, 55, 541, 1, 0, 0, 0, 57, 549, 1, 0, 0, 0, 59, 555, 1, 0, 0, 0, 61, 563, 1, 0, 0, 0, 63, 569, 1, 0, 0, 0, 65, 572, 1, 0, 0, 0, 67, 582, 1, 0, 0, 0, 69, 586, 1, 0, 0, 0, 71, 591, 1, 0, 0, 0, 73, 596, 1, 0, 0, 0, 75, 600, 1, 0, 0, 0, 77, 606, 1, 0, 0, 0, 79, 613, 1, 0, 0, 0, 81, 618, 1, 0, 0, 0, 83, 621, 1, 0, 0, 0, 85, 624, 1, 0, 0, 0, 87, 630, 1, 0, 0, 0, 89, 646, 1, 0, 0, 0, 91, 648, 1, 0, 0, 0, 93, 654, 1, 0, 0, 0, 95, 663, 1, 0, 0, 0, 97, 666, 1, 0, 0, 0, 99, 671, 1, 0, 0, 0, 101, 675, 1, 0, 0, 0, 103, 680, 1, 0, 0, 0, 105, 688, 1, 0, 0, 0, 107, 693, 1, 0, 0, 0, 109, 697, 1, 0, 0, 0, 111, 702, 1, 0, 0, 0, 113, 708, 1, 0, 0, 0, 115, 715, 1, 0, 0, 0, 117, 721, 1, 0, 0, 0, 119, 725, 1, 0, 0, 0, 121, 729, 1, 0, 0, 0, 123, 734, 1, 0, 0, 0, 125, 740, 1, 0, 0, 0, 127, 747, 1, 0, 0, 0, 129, 750, 1, 0, 0, 0, 131, 753, 1, 0, 0, 0, 133, 759, 1, 0, 0, 0, 135, 765, 1, 0, 0, 0, 137, 770, 1, 0, 0, 0, 139, 780, 1, 0, 0, 0, 141, 790, 1, 0, 0, 0, 143, 799, 1, 0, 0, 0, 145, 807, 1, 0, 0, 0, 147, 813, 1, 0, 0, 0, 149, 820, 1, 0, 0, 0, 151, 826, 1, 0, 0, 0, 153, 833, 1, 0, 0, 0, 155, 837, 1, 0, 0, 0, 157, 842, 1, 0, 0, 0, 159, 849, 1, 0, 0, 0, 161, 856, 1, 0, 0, 0, 163, 863, 1, 0, 0, 0, 165, 868, 1, 0, 0, 0, 167, 877, 1, 0, 0, 0, 169, 887, 1, 0, 0, 0, 171, 892, 1, 0, 0, 0, 173, 898, 1, 0, 0, 0, 175, 903, 1, 0, 0, 0, 177, 913, 1, 0, 0, 0, 179, 916, 1, 0, 0, 0, 181, 920, 1, 0, 0, 0, 183, 927, 1, 0, 0, 0, 185, 936, 1, 0, 0, 0, 187, 941, 1, 0, 0, 0, 189, 950, 1, 0, 0, 0, 191, 954, 1, 0, 0, 0, 193, 964, 1, 0, 0, 0, 195, 970, 1, 0, 0, 0, 197, 976, 1, 0, 0, 0, 199, 981, 1, 0, 0, 0, 201, 986, 1, 0, 0, 0, 203, 992, 1, 0, 0, 0, 205, 998, 1, 0, 0, 0, 207, 1005, 1, 0, 0, 0, 209, 1020, 1, 0, 0, 0, 211, 1049, 1, 0, 0, 0, 213, 1097, 1, 0, 0, 0, 215, 1175, 1, 0, 0, 0, 217, 1177, 1, 0, 0, 0, 219, 1184, 1, 0, 0, 0, 221, 1188, 1, 0, 0, 0, 223, 1195, 1, 0, 0, 0, 225, 1211, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1215, 1, 0, 0, 0, 231, 1217, 1, 0, 0, 0, 233, 1219, 1, 0, 0, 0, 235, 1221, 1, 0, 0, 0, 237, 1223, 1, 0, 0, 0, 239, 1225, 1, 0, 0, 0, 241, 1227, 1, 0, 0, 0, 243, 1229, 1, 0, 0, 0, 245, 1231, 1, 0, 0, 0, 247, 1233, 1, 0, 0, 0, 249, 1235, 1, 0, 0, 0, 251, 1237, 1, 0, 0, 0, 253, 1239, 1, 0, 0, 0, 255, 1241, 1, 0, 0, 0, 257, 1243, 1, 0, 0, 0, 259, 1245, 1, 0, 0, 0, 261, 1247, 1, 0, 0, 0, 263, 1249, 1, 0, 0, 0, 265, 1251, 1, 0, 0, 0, 267, 1253, 1, 0, 0, 0, 269, 1255, 1, 0, 0, 0, 271, 1257, 1, 0, 0, 0, 273, 1259, 1, 0, 0, 0, 275, 1261, 1, 0, 0, 0, 277, 1263, 1, 0, 0, 0, 279, 1265, 1, 0, 0, 0, 281, 1267, 1, 0, 0, 0, 283, 1269, 1, 0, 0, 0, 285, 1271, 1, 0, 0, 0, 287, 1274, 1, 0, 0, 0, 289, 1276, 1, 0, 0, 0, 291, 1278, 1, 0, 0, 0, 293, 1280, 1, 0, 0, 0, 295, 1282, 1, 0, 0, 0, 297, 1284, 1, 0, 0, 0, 299, 1287, 1, 0, 0, 0, 301, 1289, 1, 0, 0, 0, 303, 1291, 1, 0, 0, 0, 305, 1293, 1, 0, 0, 0, 307, 1296, 1, 0, 0, 0, 309, 1298, 1, 0, 0, 0, 311, 1301, 1, 0, 0, 0, 313, 1303, 1, 0, 0, 0, 315, 1305, 1, 0, 0, 0, 317, 1308, 1, 0, 0, 0, 319, 1312, 1, 0, 0, 0, 321, 1316, 1, 0, 0, 0, 323, 1318, 1, 0, 0, 0, 325, 1320, 1, 0, 0, 0, 327, 1323, 1, 0, 0, 0, 329, 1329, 1, 0, 0, 0, 331, 1331, 1, 0, 0, 0, 333, 1335, 1, 0, 0, 0, 335, 1338, 1, 0, 0, 0, 337, 1341, 1, 0, 0, 0, 339, 1344, 1, 0, 0, 0, 341, 1346, 1, 0, 0, 0, 343, 1348, 1, 0, 0, 0, 345, 1350, 1, 0, 0, 0, 347, 1352, 1, 0, 0, 0, 349, 1357, 1, 0, 0, 0, 351, 1362, 1, 0, 0, 0, 353, 1364, 1, 0, 0, 0, 355, 1366, 1, 0, 0, 0, 357, 1369, 1, 0, 0, 0, 359, 1373, 1, 0, 0, 0, 361, 1375, 1, 0, 0, 0, 363, 1377, 1, 0, 0, 0, 365, 1379, 1, 0, 0, 0, 367, 1381, 1, 0, 0, 0, 369, 1383, 1, 0, 0, 0, 371, 1401, 1, 0, 0, 0, 373, 1414, 1, 0, 0, 0, 375, 1429, 1, 0, 0, 0, 377, 1433, 1, 0, 0, 0, 379, 1437, 1, 0, 0, 0, 381, 1447, 1, 0, 0, 0, 383, 1451, 1, 0, 0, 0, 385, 386, 3, 225, 111, 0, 386, 387, 3, 247, 122, 0, 387, 388, 3, 247, 122, 0, 388, 4, 1, 0, 0, 0, 389, 390, 3, 225, 111, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 231, 114, 0, 392, 6, 1, 0, 0, 0, 393, 394, 3, 225, 111, 0, 394, 395, 3, 251, 124, 0, 395, 396, 3, 263, 130, 0, 396, 397, 3, 241, 119, 0, 397, 8, 1, 0, 0, 0, 398, 399, 3, 225, 111, 0, 399, 400, 3, 251, 124, 0, 400, 401, 3, 273, 135, 0, 401, 10, 1, 0, 0, 0, 402, 403, 3, 225, 111, 0, 403, 404, 3, 259, 128, 0, 404, 405, 3, 259, 128, 0, 405, 406, 3, 225, 111, 0, 406, 407, 3, 273, 135, 0, 407, 12, 1, 0, 0, 0, 408, 409, 3, 225, 111, 0, 409, 410, 3, 261, 129, 0, 410, 14, 1, 0, 0, 0, 411, 412, 3, 225, 111, 0, 412, 413, 3, 261, 129, 0, 413, 414, 3, 229, 113, 0, 414, 426, 1, 0, 0, 0, 415, 416, 3, 225, 111, 0, 416, 417, 3, 261, 129, 0, 417, 418, 3, 229, 113, 0, 418, 419, 3, 233, 115, 0, 419, 420, 3, 251, 124, 0, 420, 421, 3, 231, 114, 0, 421, 422, 3, 241, 119, 0, 422, 423, 3, 251, 124, 0, 423, 424, 3, 237, 117, 0, 424, 426, 1, 0, 0, 0, 425, 411, 1, 0, 0, 0, 425, 415, 1, 0, 0, 0, 426, 16, 1, 0, 0, 0, 427, 428, 3, 225, 111, 0, 428, 429, 3, 261, 129, 0, 429, 430, 3, 253, 125, 0, 430, 431, 3, 235, 116, 0, 431, 18, 1, 0, 0, 0, 432, 433, 3, 227, 112, 0, 433, 434, 3, 233, 115, 0, 434, 435, 3, 263, 130, 0, 435, 436, 3, 269, 133, 0, 436, 437, 3, 233, 115, 0, 437, 438, 3, 233, 115, 0, 438, 439, 3, 251, 124, 0, 439, 20, 1, 0, 0, 0, 440, 441, 3, 227, 112, 0, 441, 442, 3, 253, 125, 0, 442, 443, 3, 263, 130, 0, 443, 444, 3, 239, 118, 0, 444, 22, 1, 0, 0, 0, 445, 446, 3, 227, 112, 0, 446, 447, 3, 273, 135, 0, 447, 24, 1, 0, 0, 0, 448, 449, 3, 229, 113, 0, 449, 450, 3, 225, 111, 0, 450, 451, 3, 261, 129, 0, 451, 452, 3, 233, 115, 0, 452, 26, 1, 0, 0, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 225, 111, 0, 455, 456, 3, 261, 129, 0, 456, 457, 3, 263, 130, 0, 457, 28, 1, 0, 0, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 225, 111, 0, 460, 461, 3, 263, 130, 0, 461, 462, 3, 229, 113, 0, 462, 463, 3, 239, 118, 0, 463, 30, 1, 0, 0, 0, 464, 465, 3, 229, 113, 0, 465, 466, 3, 253, 125, 0, 466, 467, 3, 239, 118, 0, 467, 468, 3, 253, 125, 0, 468, 469, 3, 259, 128, 0, 469, 470, 3, 263, 130, 0, 470, 32, 1, 0, 0, 0, 471, 472, 3, 229, 113, 0, 472, 473, 3, 253, 125, 0, 473, 474, 3, 247, 122, 0, 474, 475, 3, 247, 122, 0, 475, 476, 3, 225, 111, 0, 476, 477, 3, 263, 130, 0, 477, 478, 3, 233, 115, 0, 478, 34, 1, 0, 0, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 259, 128, 0, 481, 482, 3, 253, 125, 0, 482, 483, 3, 261, 129, 0, 483, 484, 3, 261, 129, 0, 484, 36, 1, 0, 0, 0, 485, 486, 3, 229, 113, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 227, 112, 0, 488, 489, 3, 233, 115, 0, 489, 38, 1, 0, 0, 0, 490, 491, 3, 229, 113, 0, 491, 492, 3, 265, 131, 0, 492, 493, 3, 259, 128, 0, 493, 494, 3, 259, 128, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 251, 124, 0, 496, 497, 3, 263, 130, 0, 497, 40, 1, 0, 0, 0, 498, 499, 3, 231, 114, 0, 499, 500, 3, 225, 111, 0, 500, 501, 3, 263, 130, 0, 501, 502, 3, 233, 115, 0, 502, 42, 1, 0, 0, 0, 503, 504, 3, 231, 114, 0, 504, 505, 3, 225, 111, 0, 505, 506, 3, 273, 135, 0, 506, 44, 1, 0, 0, 0, 507, 508, 3, 231, 114, 0, 508, 509, 3, 233, 115, 0, 509, 510, 3, 261, 129, 0, 510, 511, 3, 229, 113, 0, 511, 46, 1, 0, 0, 0, 512, 513, 3, 231, 114, 0, 513, 514, 3, 233, 115, 0, 514, 515, 3, 261, 129, 0, 515, 516, 3, 229, 113, 0, 516, 517, 3, 233, 115, 0, 517, 518, 3, 251, 124, 0, 518, 519, 3, 231, 114, 0, 519, 520, 3, 241, 119, 0, 520, 521, 3, 251, 124, 0, 521, 522, 3, 237, 117, 0, 522, 48, 1, 0, 0, 0, 523, 524, 3, 231, 114, 0, 524, 525, 3, 241, 119, 0, 525, 526, 3, 261, 129, 0, 526, 527, 3, 263, 130, 0, 527, 528, 3, 241, 119, 0, 528, 529, 3, 251, 124, 0, 529, 530, 3, 229, 113, 0, 530, 531, 3, 263, 130, 0, 531, 50, 1, 0, 0, 0, 532, 533, 3, 233, 115, 0, 533, 534, 3, 247, 122, 0, 534, 535, 3, 261, 129, 0, 535, 536, 3, 233, 115, 0, 536, 52, 1, 0, 0, 0, 537, 538, 3, 233, 115, 0, 538, 539, 3, 251, 124, 0, 539, 540, 3, 231, 114, 0, 540, 54, 1, 0, 0, 0, 541, 542, 3, 233, 115, 0, 542, 543, 3, 271, 134, 0, 543, 544, 3, 263, 130, 0, 544, 545, 3, 259, 128, 0, 545, 546, 3, 225, 111, 0, 546, 547, 3, 229, 113, 0, 547, 548, 3, 263, 130, 0, 548, 56, 1, 0, 0, 0, 549, 550, 3, 235, 116, 0, 550, 551, 3, 241, 119, 0, 551, 552, 3, 251, 124, 0, 552, 553, 3, 225, 111, 0, 553, 554, 3, 247, 122, 0, 554, 58, 1, 0, 0, 0, 555, 556, 3, 235, 116, 0, 556, 557, 3, 241, 119, 0, 557, 558, 3, 251, 124, 0, 558, 559, 3, 225, 111, 0, 559, 560, 3, 247, 122, 0, 560, 561, 3, 247, 122, 0, 561, 562, 3, 273, 135, 0, 562, 60, 1, 0, 0, 0, 563, 564, 3, 235, 116, 0, 564, 565, 3, 241, 119, 0, 565, 566, 3, 259, 128, 0, 566, 567, 3, 261, 129, 0, 567, 568, 3, 263, 130, 0, 568, 62, 1, 0, 0, 0, 569, 570, 3, 235, 116, 0, 570, 571, 3, 251, 124, 0, 571, 64, 1, 0, 0, 0, 572, 573, 3, 235, 116, 0, 573, 574, 3, 253, 125, 0, 574, 575, 3, 247, 122, 0, 575, 576, 3, 247, 122, 0, 576, 577, 3, 253, 125, 0, 577, 578, 3, 269, 133, 0, 578, 579, 3, 241, 119, 0, 579, 580, 3, 251, 124, 0, 580, 581, 3, 237, 117, 0, 581, 66, 1, 0, 0, 0, 582, 583, 3, 235, 116, 0, 583, 584, 3, 253, 125, 0, 584, 585, 3, 259, 128, 0, 585, 68, 1, 0, 0, 0, 586, 587, 3, 235, 116, 0, 587, 588, 3, 259, 128, 0, 588, 589, 3, 253, 125, 0, 589, 590, 3, 249, 123, 0, 590, 70, 1, 0, 0, 0, 591, 592, 3, 235, 116, 0, 592, 593, 3, 265, 131, 0, 593, 594, 3, 247, 122, 0, 594, 595, 3, 247, 122, 0, 595, 72, 1, 0, 0, 0, 596, 597, 3, 235, 116, 0, 597, 598, 3, 265, 131, 0, 598, 599, 3, 251, 124, 0, 599, 74, 1, 0, 0, 0, 600, 601, 3, 237, 117, 0, 601, 602, 3, 259, 128, 0, 602, 603, 3, 253, 125, 0, 603, 604, 3, 265, 131, 0, 604, 605, 3, 255, 126, 0, 605, 76, 1, 0, 0, 0, 606, 607, 3, 239, 118, 0, 607, 608, 3, 225, 111, 0, 608, 609, 3, 267, 132, 0, 609, 610, 3, 241, 119, 0, 610, 611, 3, 251, 124, 0, 611, 612, 3, 237, 117, 0, 612, 78, 1, 0, 0, 0, 613, 614, 3, 239, 118, 0, 614, 615, 3, 253, 125, 0, 615, 616, 3, 265, 131, 0, 616, 617, 3, 259, 128, 0, 617, 80, 1, 0, 0, 0, 618, 619, 3, 241, 119, 0, 619, 620, 3, 231, 114, 0, 620, 82, 1, 0, 0, 0, 621, 622, 3, 241, 119, 0, 622, 623, 3, 235, 116, 0, 623, 84, 1, 0, 0, 0, 624, 625, 3, 241, 119, 0, 625, 626, 3, 247, 122, 0, 626, 627, 3, 241, 119, 0, 627, 628, 3, 245, 121, 0, 628, 629, 3, 233, 115, 0, 629, 86, 1, 0, 0, 0, 630, 631, 3, 241, 119, 0, 631, 632, 3, 251, 124, 0, 632, 88, 1, 0, 0, 0, 633, 634, 3, 241, 119, 0, 634, 635, 3, 251, 124, 0, 635, 636, 3, 235, 116, 0, 636, 647, 1, 0, 0, 0, 637, 638, 3, 241, 119, 0, 638, 639, 3, 251, 124, 0, 639, 640, 3, 235, 116, 0, 640, 641, 3, 241, 119, 0, 641, 642, 3, 251, 124, 0, 642, 643, 3, 241, 119, 0, 643, 644, 3, 263, 130, 0, 644, 645, 3, 273, 135, 0, 645, 647, 1, 0, 0, 0, 646, 633, 1, 0, 0, 0, 646, 637, 1, 0, 0, 0, 647, 90, 1, 0, 0, 0, 648, 649, 3, 241, 119, 0, 649, 650, 3, 251, 124, 0, 650, 651, 3, 251, 124, 0, 651, 652, 3, 233, 115, 0, 652, 653, 3, 259, 128, 0, 653, 92, 1, 0, 0, 0, 654, 655, 3, 241, 119, 0, 655, 656, 3, 251, 124, 0, 656, 657, 3, 263, 130, 0, 657, 658, 3, 233, 115, 0, 658, 659, 3, 259, 128, 0, 659, 660, 3, 267, 132, 0, 660, 661, 3, 225, 111, 0, 661, 662, 3, 247, 122, 0, 662, 94, 1, 0, 0, 0, 663, 664, 3, 241, 119, 0, 664, 665, 3, 261, 129, 0, 665, 96, 1, 0, 0, 0, 666, 667, 3, 243, 120, 0, 667, 668, 3, 253, 125, 0, 668, 669, 3, 241, 119, 0, 669, 670, 3, 251, 124, 0, 670, 98, 1, 0, 0, 0, 671, 672, 3, 245, 121, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 273, 135, 0, 674, 100, 1, 0, 0, 0, 675, 676, 3, 247, 122, 0, 676, 677, 3, 225, 111, 0, 677, 678, 3, 261, 129, 0, 678, 679, 3, 263, 130, 0, 679, 102, 1, 0, 0, 0, 680, 681, 3, 247, 122, 0, 681, 682, 3, 233, 115, 0, 682, 683, 3, 225, 111, 0, 683, 684, 3, 231, 114, 0, 684, 685, 3, 241, 119, 0, 685, 686, 3, 251, 124, 0, 686, 687, 3, 237, 117, 0, 687, 104, 1, 0, 0, 0, 688, 689, 3, 247, 122, 0, 689, 690, 3, 233, 115, 0, 690, 691, 3, 235, 116, 0, 691, 692, 3, 263, 130, 0, 692, 106, 1, 0, 0, 0, 693, 694, 3, 247, 122, 0, 694, 695, 3, 233, 115, 0, 695, 696, 3, 263, 130, 0, 696, 108, 1, 0, 0, 0, 697, 698, 3, 247, 122, 0, 698, 699, 3, 241, 119, 0, 699, 700, 3, 245, 121, 0, 700, 701, 3, 233, 115, 0, 701, 110, 1, 0, 0, 0, 702, 703, 3, 247, 122, 0, 703, 704, 3, 241, 119, 0, 704, 705, 3, 249, 123, 0, 705, 706, 3, 241, 119, 0, 706, 707, 3, 263, 130, 0, 707, 112, 1, 0, 0, 0, 708, 709, 3, 249, 123, 0, 709, 710, 3, 241, 119, 0, 710, 711, 3, 251, 124, 0, 711, 712, 3, 265, 131, 0, 712, 713, 3, 263, 130, 0, 713, 714, 3, 233, 115, 0, 714, 114, 1, 0, 0, 0, 715, 716, 3, 249, 123, 0, 716, 717, 3, 253, 125, 0, 717, 718, 3, 251, 124, 0, 718, 719, 3, 263, 130, 0, 719, 720, 3, 239, 118, 0, 720, 116, 1, 0, 0, 0, 721, 722, 3, 251, 124, 0, 722, 723, 3, 225, 111, 0, 723, 724, 3, 251, 124, 0, 724, 118, 1, 0, 0, 0, 725, 726, 3, 251, 124, 0, 726, 727, 3, 253, 125, 0, 727, 728, 3, 263, 130, 0, 728, 120, 1, 0, 0, 0, 729, 730, 3, 251, 124, 0, 730, 731, 3, 265, 131, 0, 731, 732, 3, 247, 122, 0, 732, 733, 3, 247, 122, 0, 733, 122, 1, 0, 0, 0, 734, 735, 3, 251, 124, 0, 735, 736, 3, 265, 131, 0, 736, 737, 3, 247, 122, 0, 737, 738, 3, 247, 122, 0, 738, 739, 3, 261, 129, 0, 739, 124, 1, 0, 0, 0, 740, 741, 3, 253, 125, 0, 741, 742, 3, 235, 116, 0, 742, 743, 3, 235, 116, 0, 743, 744, 3, 261, 129, 0, 744, 745, 3, 233, 115, 0, 745, 746, 3, 263, 130, 0, 746, 126, 1, 0, 0, 0, 747, 748, 3, 253, 125, 0, 748, 749, 3, 251, 124, 0, 749, 128, 1, 0, 0, 0, 750, 751, 3, 253, 125, 0, 751, 752, 3, 259, 128, 0, 752, 130, 1, 0, 0, 0, 753, 754, 3, 253, 125, 0, 754, 755, 3, 259, 128, 0, 755, 756, 3, 231, 114, 0, 756, 757, 3, 233, 115, 0, 757, 758, 3, 259, 128, 0, 758, 132, 1, 0, 0, 0, 759, 760, 3, 253, 125, 0, 760, 761, 3, 265, 131, 0, 761, 762, 3, 263, 130, 0, 762, 763, 3, 233, 115, 0, 763, 764, 3, 259, 128, 0, 764, 134, 1, 0, 0, 0, 765, 766, 3, 253, 125, 0, 766, 767, 3, 267, 132, 0, 767, 768, 3, 233, 115, 0, 768, 769, 3, 259, 128, 0, 769, 136, 1, 0, 0, 0, 770, 771, 3, 255, 126, 0, 771, 772, 3, 225, 111, 0, 772, 773, 3, 259, 128, 0, 773, 774, 3, 263, 130, 0, 774, 775, 3, 241, 119, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 241, 119, 0, 777, 778, 3, 253, 125, 0, 778, 779, 3, 251, 124, 0, 779, 138, 1, 0, 0, 0, 780, 781, 3, 255, 126, 0, 781, 782, 3, 259, 128, 0, 782, 783, 3, 233, 115, 0, 783, 784, 3, 229, 113, 0, 784, 785, 3, 233, 115, 0, 785, 786, 3, 231, 114, 0, 786, 787, 3, 241, 119, 0, 787, 788, 3, 251, 124, 0, 788, 789, 3, 237, 117, 0, 789, 140, 1, 0, 0, 0, 790, 791, 3, 255, 126, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 233, 115, 0, 793, 794, 3, 269, 133, 0, 794, 795, 3, 239, 118, 0, 795, 796, 3, 233, 115, 0, 796, 797, 3, 259, 128, 0, 797, 798, 3, 233, 115, 0, 798, 142, 1, 0, 0, 0, 799, 800, 3, 257, 127, 0, 800, 801, 3, 265, 131, 0, 801, 802, 3, 225, 111, 0, 802, 803, 3, 259, 128, 0, 803, 804, 3, 263, 130, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 259, 128, 0, 806, 144, 1, 0, 0, 0, 807, 808, 3, 259, 128, 0, 808, 809, 3, 225, 111, 0, 809, 810, 3, 251, 124, 0, 810, 811, 3, 237, 117, 0, 811, 812, 3, 233, 115, 0, 812, 146, 1, 0, 0, 0, 813, 814, 3, 259, 128, 0, 814, 815, 3, 233, 115, 0, 815, 816, 3, 263, 130, 0, 816, 817, 3, 265, 131, 0, 817, 818, 3, 259, 128, 0, 818, 819, 3, 251, 124, 0, 819, 148, 1, 0, 0, 0, 820, 821, 3, 259, 128, 0, 821, 822, 3, 241, 119, 0, 822, 823, 3, 237, 117, 0, 823, 824, 3, 239, 118, 0, 824, 825, 3, 263, 130, 0, 825, 150, 1, 0, 0, 0, 826, 827, 3, 259, 128, 0, 827, 828, 3, 253, 125, 0, 828, 829, 3, 247, 122, 0, 829, 830, 3, 247, 122, 0, 830, 831, 3, 265, 131, 0, 831, 832, 3, 255, 126, 0, 832, 152, 1, 0, 0, 0, 833, 834, 3, 259, 128, 0, 834, 835, 3, 253, 125, 0, 835, 836, 3, 269, 133, 0, 836, 154, 1, 0, 0, 0, 837, 838, 3, 259, 128, 0, 838, 839, 3, 253, 125, 0, 839, 840, 3, 269, 133, 0, 840, 841, 3, 261, 129, 0, 841, 156, 1, 0, 0, 0, 842, 843, 3, 261, 129, 0, 843, 844, 3, 225, 111, 0, 844, 845, 3, 249, 123, 0, 845, 846, 3, 255, 126, 0, 846, 847, 3, 247, 122, 0, 847, 848, 3, 233, 115, 0, 848, 158, 1, 0, 0, 0, 849, 850, 3, 261, 129, 0, 850, 851, 3, 233, 115, 0, 851, 852, 3, 229, 113, 0, 852, 853, 3, 253, 125, 0, 853, 854, 3, 251, 124, 0, 854, 855, 3, 231, 114, 0, 855, 160, 1, 0, 0, 0, 856, 857, 3, 261, 129, 0, 857, 858, 3, 233, 115, 0, 858, 859, 3, 247, 122, 0, 859, 860, 3, 233, 115, 0, 860, 861, 3, 229, 113, 0, 861, 862, 3, 263, 130, 0, 862, 162, 1, 0, 0, 0, 863, 864, 3, 261, 129, 0, 864, 865, 3, 233, 115, 0, 865, 866, 3, 249, 123, 0, 866, 867, 3, 241, 119, 0, 867, 164, 1, 0, 0, 0, 868, 869, 3, 261, 129, 0, 869, 870, 3, 233, 115, 0, 870, 871, 3, 263, 130, 0, 871, 872, 3, 263, 130, 0, 872, 873, 3, 241, 119, 0, 873, 874, 3, 251, 124, 0, 874, 875, 3, 237, 117, 0, 875, 876, 3, 261, 129, 0, 876, 166, 1, 0, 0, 0, 877, 878, 3, 261, 129, 0, 878, 879, 3, 265, 131, 0, 879, 880, 3, 227, 112, 0, 880, 881, 3, 261, 129, 0, 881, 882, 3, 263, 130, 0, 882, 883, 3, 259, 128, 0, 883, 884, 3, 241, 119, 0, 884, 885, 3, 251, 124, 0, 885, 886, 3, 237, 117, 0, 886, 168, 1, 0, 0, 0, 887, 888, 3, 263, 130, 0, 888, 889, 3, 239, 118, 0, 889, 890, 3, 233, 115, 0, 890, 891, 3, 251, 124, 0, 891, 170, 1, 0, 0, 0, 892, 893, 3, 263, 130, 0, 893, 894, 3, 239, 118, 0, 894, 895, 3, 259, 128, 0, 895, 896, 3, 253, 125, 0, 896, 897, 3, 269, 133, 0, 897, 172, 1, 0, 0, 0, 898, 899, 3, 263, 130, 0, 899, 900, 3, 241, 119, 0, 900, 901, 3, 233, 115, 0, 901, 902, 3, 261, 129, 0, 902, 174, 1, 0, 0, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 241, 119, 0, 905, 906, 3, 249, 123, 0, 906, 907, 3, 233, 115, 0, 907, 908, 3, 261, 129, 0, 908, 909, 3, 263, 130, 0, 909, 910, 3, 225, 111, 0, 910, 911, 3, 249, 123, 0, 911, 912, 3, 255, 126, 0, 912, 176, 1, 0, 0, 0, 913, 914, 3, 263, 130, 0, 914, 915, 3, 253, 125, 0, 915, 178, 1, 0, 0, 0, 916, 917, 3, 263, 130, 0, 917, 918, 3, 253, 125, 0, 918, 919, 3, 255, 126, 0, 919, 180, 1, 0, 0, 0, 920, 921, 3, 263, 130, 0, 921, 922, 3, 253, 125, 0, 922, 923, 3, 263, 130, 0, 923, 924, 3, 225, 111, 0, 924, 925, 3, 247, 122, 0, 925, 926, 3, 261, 129, 0, 926, 182, 1, 0, 0, 0, 927, 928, 3, 263, 130, 0, 928, 929, 3, 259, 128, 0, 929, 930, 3, 225, 111, 0, 930, 931, 3, 241, 119, 0, 931, 932, 3, 247, 122, 0, 932, 933, 3, 241, 119, 0, 933, 934, 3, 251, 124, 0, 934, 935, 3, 237, 117, 0, 935, 184, 1, 0, 0, 0, 936, 937, 3, 263, 130, 0, 937, 938, 3, 259, 128, 0, 938, 939, 3, 241, 119, 0, 939, 940, 3, 249, 123, 0, 940, 186, 1, 0, 0, 0, 941, 942, 3, 263, 130, 0, 942, 943, 3, 259, 128, 0, 943, 944, 3, 265, 131, 0, 944, 945, 3, 251, 124, 0, 945, 946, 3, 229, 113, 0, 946, 947, 3, 225, 111, 0, 947, 948, 3, 263, 130, 0, 948, 949, 3, 233, 115, 0, 949, 188, 1, 0, 0, 0, 950, 951, 3, 263, 130, 0, 951, 952, 3, 259, 128, 0, 952, 953, 3, 273, 135, 0, 953, 190, 1, 0, 0, 0, 954, 955, 3, 265, 131, 0, 955, 956, 3, 251, 124, 0, 956, 957, 3, 227, 112, 0, 957, 958, 3, 253, 125, 0, 958, 959, 3, 265, 131, 0, 959, 960, 3, 251, 124, 0, 960, 961, 3, 231, 114, 0, 961, 962, 3, 233, 115, 0, 962, 963, 3, 231, 114, 0, 963, 192, 1, 0, 0, 0, 964, 965, 3, 265, 131, 0, 965, 966, 3, 251, 124, 0, 966, 967, 3, 241, 119, 0, 967, 968, 3, 253, 125, 0, 968, 969, 3, 251, 124, 0, 969, 194, 1, 0, 0, 0, 970, 971, 3, 265, 131, 0, 971, 972, 3, 261, 129, 0, 972, 973, 3, 241, 119, 0, 973, 974, 3, 251, 124, 0, 974, 975, 3, 237, 117, 0, 975, 196, 1, 0, 0, 0, 976, 977, 3, 269, 133, 0, 977, 978, 3, 233, 115, 0, 978, 979, 3, 233, 115, 0, 979, 980, 3, 245, 121, 0, 980, 198, 1, 0, 0, 0, 981, 982, 3, 269, 133, 0, 982, 983, 3, 239, 118, 0, 983, 984, 3, 233, 115, 0, 984, 985, 3, 251, 124, 0, 985, 200, 1, 0, 0, 0, 986, 987, 3, 269, 133, 0, 987, 988, 3, 239, 118, 0, 988, 989, 3, 233, 115, 0, 989, 990, 3, 259, 128, 0, 990, 991, 3, 233, 115, 0, 991, 202, 1, 0, 0, 0, 992, 993, 3, 269, 133, 0, 993, 994, 3, 239, 118, 0, 994, 995, 3, 241, 119, 0, 995, 996, 3, 247, 122, 0, 996, 997, 3, 233, 115, 0, 997, 204, 1, 0, 0, 0, 998, 999, 3, 269, 133, 0, 999, 1000, 3, 241, 119, 0, 1000, 1001, 3, 251, 124, 0, 1001, 1002, 3, 231, 114, 0, 1002, 1003, 3, 253, 125, 0, 1003, 1004, 3, 269, 133, 0, 1004, 206, 1, 0, 0, 0, 1005, 1006, 3, 269, 133, 0, 1006, 1007, 3, 241, 119, 0, 1007, 1008, 3, 263, 130, 0, 1008, 1009, 3, 239, 118, 0, 1009, 208, 1, 0, 0, 0, 1010, 1011, 3, 273, 135, 0, 1011, 1012, 3, 233, 115, 0, 1012, 1013, 3, 225, 111, 0, 1013, 1014, 3, 259, 128, 0, 1014, 1021, 1, 0, 0, 0, 1015, 1016, 3, 273, 135, 0, 1016, 1017, 3, 273, 135, 0, 1017, 1018, 3, 273, 135, 0, 1018, 1019, 3, 273, 135, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1010, 1, 0, 0, 0, 1020, 1015, 1, 0, 0, 0, 1021, 210, 1, 0, 0, 0, 1022, 1023, 3, 291, 144, 0, 1023, 1024, 3, 227, 112, 0, 1024, 1050, 1, 0, 0, 0, 1025, 1026, 3, 291, 144, 0, 1026, 1027, 3, 235, 116, 0, 1027, 1050, 1, 0, 0, 0, 1028, 1029, 3, 291, 144, 0, 1029, 1030, 3, 259, 128, 0, 1030, 1050, 1, 0, 0, 0, 1031, 1032, 3, 291, 144, 0, 1032, 1033, 3, 251, 124, 0, 1033, 1050, 1, 0, 0, 0, 1034, 1035, 3, 291, 144, 0, 1035, 1036, 3, 263, 130, 0, 1036, 1050, 1, 0, 0, 0, 1037, 1038, 3, 291, 144, 0, 1038, 1039, 5, 48, 0, 0, 1039, 1050, 1, 0, 0, 0, 1040, 1041, 3, 291, 144, 0, 1041, 1042, 3, 225, 111, 0, 1042, 1050, 1, 0, 0, 0, 1043, 1044, 3, 291, 144, 0, 1044, 1045, 3, 267, 132, 0, 1045, 1050, 1, 0, 0, 0, 1046, 1047, 3, 291, 144, 0, 1047, 1048, 3, 291, 144, 0, 1048, 1050, 1, 0, 0, 0, 1049, 1022, 1, 0, 0, 0, 1049, 1025, 1, 0, 0, 0, 1049, 1028, 1, 0, 0, 0, 1049, 1031, 1, 0, 0, 0, 1049, 1034, 1, 0, 0, 0, 1049, 1037, 1, 0, 0, 0, 1049, 1040, 1, 0, 0, 0, 1049, 1043, 1, 0, 0, 0, 1049, 1046, 1, 0, 0, 0, 1050, 212, 1, 0, 0, 0, 1051, 1055, 3, 277, 137, 0, 1052, 1055, 3, 367, 182, 0, 1053, 1055, 3, 301, 149, 0, 1054, 1051, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1062, 1, 0, 0, 0, 1056, 1061, 3, 277, 137, 0, 1057, 1061, 3, 367, 182, 0, 1058, 1061, 3, 281, 139, 0, 1059, 1061, 3, 301, 149, 0, 1060, 1056, 1, 0, 0, 0, 1060, 1057, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1060, 1059, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1098, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1076, 3, 289, 143, 0, 1066, 1075, 8, 0, 0, 0, 1067, 1075, 3, 211, 104, 0, 1068, 1069, 3, 291, 144, 0, 1069, 1070, 3, 351, 174, 0, 1070, 1075, 1, 0, 0, 0, 1071, 1072, 3, 289, 143, 0, 1072, 1073, 3, 289, 143, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1066, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1079, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1079, 1080, 3, 289, 143, 0, 1080, 1098, 1, 0, 0, 0, 1081, 1092, 3, 345, 171, 0, 1082, 1091, 8, 1, 0, 0, 1083, 1091, 3, 211, 104, 0, 1084, 1085, 3, 291, 144, 0, 1085, 1086, 3, 345, 171, 0, 1086, 1091, 1, 0, 0, 0, 1087, 1088, 3, 345, 171, 0, 1088, 1089, 3, 345, 171, 0, 1089, 1091, 1, 0, 0, 0, 1090, 1082, 1, 0, 0, 0, 1090, 1083, 1, 0, 0, 0, 1090, 1084, 1, 0, 0, 0, 1090, 1087, 1, 0, 0, 0, 1091, 1094, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1095, 1096, 3, 345, 171, 0, 1096, 1098, 1, 0, 0, 0, 1097, 1054, 1, 0, 0, 0, 1097, 1065, 1, 0, 0, 0, 1097, 1081, 1, 0, 0, 0, 1098, 214, 1, 0, 0, 0, 1099, 1100, 3, 221, 109, 0, 1100, 1104, 3, 303, 150, 0, 1101, 1103, 3, 283, 140, 0, 1102, 1101, 1, 0, 0, 0, 1103, 1106, 1, 0, 0, 0, 1104, 1102, 1, 0, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1109, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1107, 1110, 3, 255, 126, 0, 1108, 1110, 3, 233, 115, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1108, 1, 0, 0, 0, 1110, 1113, 1, 0, 0, 0, 1111, 1114, 3, 341, 169, 0, 1112, 1114, 3, 299, 148, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1117, 3, 281, 139, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1116, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1176, 1, 0, 0, 0, 1120, 1123, 3, 221, 109, 0, 1121, 1124, 3, 255, 126, 0, 1122, 1124, 3, 233, 115, 0, 1123, 1121, 1, 0, 0, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1128, 3, 341, 169, 0, 1126, 1128, 3, 299, 148, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1126, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1130, 1, 0, 0, 0, 1129, 1131, 3, 281, 139, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1176, 1, 0, 0, 0, 1134, 1135, 3, 219, 108, 0, 1135, 1139, 3, 303, 150, 0, 1136, 1138, 3, 281, 139, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1141, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1142, 1145, 3, 233, 115, 0, 1143, 1146, 3, 341, 169, 0, 1144, 1146, 3, 299, 148, 0, 1145, 1143, 1, 0, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1148, 1, 0, 0, 0, 1147, 1149, 3, 281, 139, 0, 1148, 1147, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1176, 1, 0, 0, 0, 1152, 1153, 3, 303, 150, 0, 1153, 1154, 3, 219, 108, 0, 1154, 1157, 3, 233, 115, 0, 1155, 1158, 3, 341, 169, 0, 1156, 1158, 3, 299, 148, 0, 1157, 1155, 1, 0, 0, 0, 1157, 1156, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1160, 1, 0, 0, 0, 1159, 1161, 3, 281, 139, 0, 1160, 1159, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1176, 1, 0, 0, 0, 1164, 1165, 3, 219, 108, 0, 1165, 1168, 3, 233, 115, 0, 1166, 1169, 3, 341, 169, 0, 1167, 1169, 3, 299, 148, 0, 1168, 1166, 1, 0, 0, 0, 1168, 1167, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1171, 1, 0, 0, 0, 1170, 1172, 3, 281, 139, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1099, 1, 0, 0, 0, 1175, 1120, 1, 0, 0, 0, 1175, 1134, 1, 0, 0, 0, 1175, 1152, 1, 0, 0, 0, 1175, 1164, 1, 0, 0, 0, 1176, 216, 1, 0, 0, 0, 1177, 1179, 5, 48, 0, 0, 1178, 1180, 3, 279, 138, 0, 1179, 1178, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1179, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 218, 1, 0, 0, 0, 1183, 1185, 3, 281, 139, 0, 1184, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1184, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 220, 1, 0, 0, 0, 1188, 1189, 5, 48, 0, 0, 1189, 1191, 3, 271, 134, 0, 1190, 1192, 3, 283, 140, 0, 1191, 1190, 1, 0, 0, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 222, 1, 0, 0, 0, 1195, 1206, 3, 351, 174, 0, 1196, 1205, 8, 2, 0, 0, 1197, 1205, 3, 211, 104, 0, 1198, 1199, 3, 291, 144, 0, 1199, 1200, 3, 351, 174, 0, 1200, 1205, 1, 0, 0, 0, 1201, 1202, 3, 351, 174, 0, 1202, 1203, 3, 351, 174, 0, 1203, 1205, 1, 0, 0, 0, 1204, 1196, 1, 0, 0, 0, 1204, 1197, 1, 0, 0, 0, 1204, 1198, 1, 0, 0, 0, 1204, 1201, 1, 0, 0, 0, 1205, 1208, 1, 0, 0, 0, 1206, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1209, 1210, 3, 351, 174, 0, 1210, 224, 1, 0, 0, 0, 1211, 1212, 7, 3, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 7, 4, 0, 0, 1214, 228, 1, 0, 0, 0, 1215, 1216, 7, 5, 0, 0, 1216, 230, 1, 0, 0, 0, 1217, 1218, 7, 6, 0, 0, 1218, 232, 1, 0, 0, 0, 1219, 1220, 7, 7, 0, 0, 1220, 234, 1, 0, 0, 0, 1221, 1222, 7, 8, 0, 0, 1222, 236, 1, 0, 0, 0, 1223, 1224, 7, 9, 0, 0, 1224, 238, 1, 0, 0, 0, 1225, 1226, 7, 10, 0, 0, 1226, 240, 1, 0, 0, 0, 1227, 1228, 7, 11, 0, 0, 1228, 242, 1, 0, 0, 0, 1229, 1230, 7, 12, 0, 0, 1230, 244, 1, 0, 0, 0, 1231, 1232, 7, 13, 0, 0, 1232, 246, 1, 0, 0, 0, 1233, 1234, 7, 14, 0, 0, 1234, 248, 1, 0, 0, 0, 1235, 1236, 7, 15, 0, 0, 1236, 250, 1, 0, 0, 0, 1237, 1238, 7, 16, 0, 0, 1238, 252, 1, 0, 0, 0, 1239, 1240, 7, 17, 0, 0, 1240, 254, 1, 0, 0, 0, 1241, 1242, 7, 18, 0, 0, 1242, 256, 1, 0, 0, 0, 1243, 1244, 7, 19, 0, 0, 1244, 258, 1, 0, 0, 0, 1245, 1246, 7, 20, 0, 0, 1246, 260, 1, 0, 0, 0, 1247, 1248, 7, 21, 0, 0, 1248, 262, 1, 0, 0, 0, 1249, 1250, 7, 22, 0, 0, 1250, 264, 1, 0, 0, 0, 1251, 1252, 7, 23, 0, 0, 1252, 266, 1, 0, 0, 0, 1253, 1254, 7, 24, 0, 0, 1254, 268, 1, 0, 0, 0, 1255, 1256, 7, 25, 0, 0, 1256, 270, 1, 0, 0, 0, 1257, 1258, 7, 26, 0, 0, 1258, 272, 1, 0, 0, 0, 1259, 1260, 7, 27, 0, 0, 1260, 274, 1, 0, 0, 0, 1261, 1262, 7, 28, 0, 0, 1262, 276, 1, 0, 0, 0, 1263, 1264, 7, 29, 0, 0, 1264, 278, 1, 0, 0, 0, 1265, 1266, 7, 30, 0, 0, 1266, 280, 1, 0, 0, 0, 1267, 1268, 7, 31, 0, 0, 1268, 282, 1, 0, 0, 0, 1269, 1270, 7, 32, 0, 0, 1270, 284, 1, 0, 0, 0, 1271, 1272, 5, 45, 0, 0, 1272, 1273, 5, 62, 0, 0, 1273, 286, 1, 0, 0, 0, 1274, 1275, 5, 42, 0, 0, 1275, 288, 1, 0, 0, 0, 1276, 1277, 5, 96, 0, 0, 1277, 290, 1, 0, 0, 0, 1278, 1279, 5, 92, 0, 0, 1279, 292, 1, 0, 0, 0, 1280, 1281, 5, 58, 0, 0, 1281, 294, 1, 0, 0, 0, 1282, 1283, 5, 44, 0, 0, 1283, 296, 1, 0, 0, 0, 1284, 1285, 5, 124, 0, 0, 1285, 1286, 5, 124, 0, 0, 1286, 298, 1, 0, 0, 0, 1287, 1288, 5, 45, 0, 0, 1288, 300, 1, 0, 0, 0, 1289, 1290, 5, 36, 0, 0, 1290, 302, 1, 0, 0, 0, 1291, 1292, 5, 46, 0, 0, 1292, 304, 1, 0, 0, 0, 1293, 1294, 5, 61, 0, 0, 1294, 1295, 5, 61, 0, 0, 1295, 306, 1, 0, 0, 0, 1296, 1297, 5, 61, 0, 0, 1297, 308, 1, 0, 0, 0, 1298, 1299, 5, 62, 0, 0, 1299, 1300, 5, 61, 0, 0, 1300, 310, 1, 0, 0, 0, 1301, 1302, 5, 62, 0, 0, 1302, 312, 1, 0, 0, 0, 1303, 1304, 5, 35, 0, 0, 1304, 314, 1, 0, 0, 0, 1305, 1306, 5, 126, 0, 0, 1306, 1307, 5, 42, 0, 0, 1307, 316, 1, 0, 0, 0, 1308, 1309, 5, 61, 0, 0, 1309, 1310, 5, 126, 0, 0, 1310, 1311, 5, 42, 0, 0, 1311, 318, 1, 0, 0, 0, 1312, 1313, 5, 123, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 158, 0, 0, 1315, 320, 1, 0, 0, 0, 1316, 1317, 5, 91, 0, 0, 1317, 322, 1, 0, 0, 0, 1318, 1319, 5, 40, 0, 0, 1319, 324, 1, 0, 0, 0, 1320, 1321, 5, 60, 0, 0, 1321, 1322, 5, 61, 0, 0, 1322, 326, 1, 0, 0, 0, 1323, 1324, 5, 60, 0, 0, 1324, 328, 1, 0, 0, 0, 1325, 1326, 5, 33, 0, 0, 1326, 1330, 5, 61, 0, 0, 1327, 1328, 5, 60, 0, 0, 1328, 1330, 5, 62, 0, 0, 1329, 1325, 1, 0, 0, 0, 1329, 1327, 1, 0, 0, 0, 1330, 330, 1, 0, 0, 0, 1331, 1332, 5, 33, 0, 0, 1332, 1333, 5, 126, 0, 0, 1333, 1334, 5, 42, 0, 0, 1334, 332, 1, 0, 0, 0, 1335, 1336, 5, 33, 0, 0, 1336, 1337, 5, 126, 0, 0, 1337, 334, 1, 0, 0, 0, 1338, 1339, 5, 63, 0, 0, 1339, 1340, 5, 46, 0, 0, 1340, 336, 1, 0, 0, 0, 1341, 1342, 5, 63, 0, 0, 1342, 1343, 5, 63, 0, 0, 1343, 338, 1, 0, 0, 0, 1344, 1345, 5, 37, 0, 0, 1345, 340, 1, 0, 0, 0, 1346, 1347, 5, 43, 0, 0, 1347, 342, 1, 0, 0, 0, 1348, 1349, 5, 63, 0, 0, 1349, 344, 1, 0, 0, 0, 1350, 1351, 5, 34, 0, 0, 1351, 346, 1, 0, 0, 0, 1352, 1353, 5, 102, 0, 0, 1353, 1354, 5, 39, 0, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 172, 1, 0, 1356, 348, 1, 0, 0, 0, 1357, 1358, 5, 70, 0, 0, 1358, 1359, 5, 39, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1361, 6, 173, 2, 0, 1361, 350, 1, 0, 0, 0, 1362, 1363, 5, 39, 0, 0, 1363, 352, 1, 0, 0, 0, 1364, 1365, 5, 126, 0, 0, 1365, 354, 1, 0, 0, 0, 1366, 1367, 5, 61, 0, 0, 1367, 1368, 5, 126, 0, 0, 1368, 356, 1, 0, 0, 0, 1369, 1370, 5, 125, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 177, 3, 0, 1372, 358, 1, 0, 0, 0, 1373, 1374, 5, 93, 0, 0, 1374, 360, 1, 0, 0, 0, 1375, 1376, 5, 41, 0, 0, 1376, 362, 1, 0, 0, 0, 1377, 1378, 5, 59, 0, 0, 1378, 364, 1, 0, 0, 0, 1379, 1380, 5, 47, 0, 0, 1380, 366, 1, 0, 0, 0, 1381, 1382, 5, 95, 0, 0, 1382, 368, 1, 0, 0, 0, 1383, 1384, 5, 47, 0, 0, 1384, 1385, 5, 42, 0, 0, 1385, 1389, 1, 0, 0, 0, 1386, 1388, 9, 0, 0, 0, 1387, 1386, 1, 0, 0, 0, 1388, 1391, 1, 0, 0, 0, 1389, 1390, 1, 0, 0, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1393, 5, 42, 0, 0, 1393, 1394, 5, 47, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 183, 4, 0, 1396, 370, 1, 0, 0, 0, 1397, 1398, 5, 45, 0, 0, 1398, 1402, 5, 45, 0, 0, 1399, 1400, 5, 47, 0, 0, 1400, 1402, 5, 47, 0, 0, 1401, 1397, 1, 0, 0, 0, 1401, 1399, 1, 0, 0, 0, 1402, 1406, 1, 0, 0, 0, 1403, 1405, 8, 33, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 1408, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1410, 1, 0, 0, 0, 1408, 1406, 1, 0, 0, 0, 1409, 1411, 7, 34, 0, 0, 1410, 1409, 1, 0, 0, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 184, 4, 0, 1413, 372, 1, 0, 0, 0, 1414, 1415, 7, 35, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 5, 0, 1417, 374, 1, 0, 0, 0, 1418, 1430, 8, 36, 0, 0, 1419, 1430, 3, 211, 104, 0, 1420, 1421, 3, 291, 144, 0, 1421, 1422, 3, 351, 174, 0, 1422, 1430, 1, 0, 0, 0, 1423, 1424, 3, 291, 144, 0, 1424, 1425, 3, 319, 158, 0, 1425, 1430, 1, 0, 0, 0, 1426, 1427, 3, 351, 174, 0, 1427, 1428, 3, 351, 174, 0, 1428, 1430, 1, 0, 0, 0, 1429, 1418, 1, 0, 0, 0, 1429, 1419, 1, 0, 0, 0, 1429, 1420, 1, 0, 0, 0, 1429, 1423, 1, 0, 0, 0, 1429, 1426, 1, 0, 0, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 376, 1, 0, 0, 0, 1433, 1434, 3, 319, 158, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 187, 0, 0, 1436, 378, 1, 0, 0, 0, 1437, 1438, 3, 351, 174, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 188, 6, 0, 1440, 1441, 6, 188, 3, 0, 1441, 380, 1, 0, 0, 0, 1442, 1448, 8, 37, 0, 0, 1443, 1448, 3, 211, 104, 0, 1444, 1445, 3, 291, 144, 0, 1445, 1446, 3, 319, 158, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1442, 1, 0, 0, 0, 1447, 1443, 1, 0, 0, 0, 1447, 1444, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 382, 1, 0, 0, 0, 1451, 1452, 3, 319, 158, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 190, 0, 0, 1454, 384, 1, 0, 0, 0, 44, 0, 1, 2, 425, 646, 1020, 1049, 1054, 1060, 1062, 1074, 1076, 1090, 1092, 1097, 1104, 1109, 1113, 1118, 1123, 1127, 1132, 1139, 1145, 1150, 1157, 1162, 1168, 1173, 1175, 1181, 1186, 1193, 1204, 1206, 1329, 1389, 1401, 1406, 1410, 1429, 1431, 1447, 1449, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 145, 0] \ No newline at end of file +[4, 0, 162, 1476, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 430, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 658, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1042, 8, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1071, 8, 106, 1, 107, 1, 107, 1, 107, 3, 107, 1076, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1082, 8, 107, 10, 107, 12, 107, 1085, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1096, 8, 107, 10, 107, 12, 107, 1099, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1112, 8, 107, 10, 107, 12, 107, 1115, 9, 107, 1, 107, 1, 107, 3, 107, 1119, 8, 107, 1, 108, 1, 108, 1, 108, 5, 108, 1124, 8, 108, 10, 108, 12, 108, 1127, 9, 108, 1, 108, 1, 108, 3, 108, 1131, 8, 108, 1, 108, 1, 108, 3, 108, 1135, 8, 108, 1, 108, 4, 108, 1138, 8, 108, 11, 108, 12, 108, 1139, 1, 108, 1, 108, 1, 108, 3, 108, 1145, 8, 108, 1, 108, 1, 108, 3, 108, 1149, 8, 108, 1, 108, 4, 108, 1152, 8, 108, 11, 108, 12, 108, 1153, 1, 108, 1, 108, 1, 108, 5, 108, 1159, 8, 108, 10, 108, 12, 108, 1162, 9, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1167, 8, 108, 1, 108, 4, 108, 1170, 8, 108, 11, 108, 12, 108, 1171, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1179, 8, 108, 1, 108, 4, 108, 1182, 8, 108, 11, 108, 12, 108, 1183, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1190, 8, 108, 1, 108, 4, 108, 1193, 8, 108, 11, 108, 12, 108, 1194, 3, 108, 1197, 8, 108, 1, 109, 1, 109, 4, 109, 1201, 8, 109, 11, 109, 12, 109, 1202, 1, 110, 4, 110, 1206, 8, 110, 11, 110, 12, 110, 1207, 1, 111, 1, 111, 1, 111, 4, 111, 1213, 8, 111, 11, 111, 12, 111, 1214, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 5, 112, 1226, 8, 112, 10, 112, 12, 112, 1229, 9, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 3, 165, 1351, 8, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 5, 185, 1409, 8, 185, 10, 185, 12, 185, 1412, 9, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 3, 186, 1423, 8, 186, 1, 186, 5, 186, 1426, 8, 186, 10, 186, 12, 186, 1429, 9, 186, 1, 186, 3, 186, 1432, 8, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 4, 188, 1451, 8, 188, 11, 188, 12, 188, 1452, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 4, 191, 1469, 8, 191, 11, 191, 12, 191, 1470, 1, 192, 1, 192, 1, 192, 1, 192, 1, 1410, 0, 193, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 112, 227, 113, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 159, 381, 160, 383, 0, 385, 161, 387, 162, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1512, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 1, 381, 1, 0, 0, 0, 1, 383, 1, 0, 0, 0, 2, 385, 1, 0, 0, 0, 2, 387, 1, 0, 0, 0, 3, 389, 1, 0, 0, 0, 5, 393, 1, 0, 0, 0, 7, 397, 1, 0, 0, 0, 9, 402, 1, 0, 0, 0, 11, 406, 1, 0, 0, 0, 13, 412, 1, 0, 0, 0, 15, 429, 1, 0, 0, 0, 17, 431, 1, 0, 0, 0, 19, 436, 1, 0, 0, 0, 21, 444, 1, 0, 0, 0, 23, 449, 1, 0, 0, 0, 25, 452, 1, 0, 0, 0, 27, 457, 1, 0, 0, 0, 29, 462, 1, 0, 0, 0, 31, 468, 1, 0, 0, 0, 33, 475, 1, 0, 0, 0, 35, 483, 1, 0, 0, 0, 37, 489, 1, 0, 0, 0, 39, 494, 1, 0, 0, 0, 41, 502, 1, 0, 0, 0, 43, 507, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 516, 1, 0, 0, 0, 49, 527, 1, 0, 0, 0, 51, 536, 1, 0, 0, 0, 53, 541, 1, 0, 0, 0, 55, 545, 1, 0, 0, 0, 57, 552, 1, 0, 0, 0, 59, 560, 1, 0, 0, 0, 61, 566, 1, 0, 0, 0, 63, 574, 1, 0, 0, 0, 65, 580, 1, 0, 0, 0, 67, 583, 1, 0, 0, 0, 69, 593, 1, 0, 0, 0, 71, 597, 1, 0, 0, 0, 73, 602, 1, 0, 0, 0, 75, 607, 1, 0, 0, 0, 77, 611, 1, 0, 0, 0, 79, 617, 1, 0, 0, 0, 81, 624, 1, 0, 0, 0, 83, 629, 1, 0, 0, 0, 85, 632, 1, 0, 0, 0, 87, 635, 1, 0, 0, 0, 89, 641, 1, 0, 0, 0, 91, 657, 1, 0, 0, 0, 93, 659, 1, 0, 0, 0, 95, 665, 1, 0, 0, 0, 97, 675, 1, 0, 0, 0, 99, 684, 1, 0, 0, 0, 101, 687, 1, 0, 0, 0, 103, 692, 1, 0, 0, 0, 105, 696, 1, 0, 0, 0, 107, 701, 1, 0, 0, 0, 109, 709, 1, 0, 0, 0, 111, 714, 1, 0, 0, 0, 113, 718, 1, 0, 0, 0, 115, 723, 1, 0, 0, 0, 117, 729, 1, 0, 0, 0, 119, 736, 1, 0, 0, 0, 121, 742, 1, 0, 0, 0, 123, 746, 1, 0, 0, 0, 125, 750, 1, 0, 0, 0, 127, 755, 1, 0, 0, 0, 129, 761, 1, 0, 0, 0, 131, 768, 1, 0, 0, 0, 133, 771, 1, 0, 0, 0, 135, 774, 1, 0, 0, 0, 137, 780, 1, 0, 0, 0, 139, 786, 1, 0, 0, 0, 141, 791, 1, 0, 0, 0, 143, 801, 1, 0, 0, 0, 145, 811, 1, 0, 0, 0, 147, 820, 1, 0, 0, 0, 149, 828, 1, 0, 0, 0, 151, 834, 1, 0, 0, 0, 153, 841, 1, 0, 0, 0, 155, 847, 1, 0, 0, 0, 157, 854, 1, 0, 0, 0, 159, 858, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 870, 1, 0, 0, 0, 165, 877, 1, 0, 0, 0, 167, 884, 1, 0, 0, 0, 169, 889, 1, 0, 0, 0, 171, 898, 1, 0, 0, 0, 173, 908, 1, 0, 0, 0, 175, 913, 1, 0, 0, 0, 177, 919, 1, 0, 0, 0, 179, 924, 1, 0, 0, 0, 181, 934, 1, 0, 0, 0, 183, 937, 1, 0, 0, 0, 185, 941, 1, 0, 0, 0, 187, 948, 1, 0, 0, 0, 189, 957, 1, 0, 0, 0, 191, 962, 1, 0, 0, 0, 193, 971, 1, 0, 0, 0, 195, 975, 1, 0, 0, 0, 197, 985, 1, 0, 0, 0, 199, 991, 1, 0, 0, 0, 201, 997, 1, 0, 0, 0, 203, 1002, 1, 0, 0, 0, 205, 1007, 1, 0, 0, 0, 207, 1013, 1, 0, 0, 0, 209, 1019, 1, 0, 0, 0, 211, 1026, 1, 0, 0, 0, 213, 1041, 1, 0, 0, 0, 215, 1070, 1, 0, 0, 0, 217, 1118, 1, 0, 0, 0, 219, 1196, 1, 0, 0, 0, 221, 1198, 1, 0, 0, 0, 223, 1205, 1, 0, 0, 0, 225, 1209, 1, 0, 0, 0, 227, 1216, 1, 0, 0, 0, 229, 1232, 1, 0, 0, 0, 231, 1234, 1, 0, 0, 0, 233, 1236, 1, 0, 0, 0, 235, 1238, 1, 0, 0, 0, 237, 1240, 1, 0, 0, 0, 239, 1242, 1, 0, 0, 0, 241, 1244, 1, 0, 0, 0, 243, 1246, 1, 0, 0, 0, 245, 1248, 1, 0, 0, 0, 247, 1250, 1, 0, 0, 0, 249, 1252, 1, 0, 0, 0, 251, 1254, 1, 0, 0, 0, 253, 1256, 1, 0, 0, 0, 255, 1258, 1, 0, 0, 0, 257, 1260, 1, 0, 0, 0, 259, 1262, 1, 0, 0, 0, 261, 1264, 1, 0, 0, 0, 263, 1266, 1, 0, 0, 0, 265, 1268, 1, 0, 0, 0, 267, 1270, 1, 0, 0, 0, 269, 1272, 1, 0, 0, 0, 271, 1274, 1, 0, 0, 0, 273, 1276, 1, 0, 0, 0, 275, 1278, 1, 0, 0, 0, 277, 1280, 1, 0, 0, 0, 279, 1282, 1, 0, 0, 0, 281, 1284, 1, 0, 0, 0, 283, 1286, 1, 0, 0, 0, 285, 1288, 1, 0, 0, 0, 287, 1290, 1, 0, 0, 0, 289, 1292, 1, 0, 0, 0, 291, 1295, 1, 0, 0, 0, 293, 1297, 1, 0, 0, 0, 295, 1299, 1, 0, 0, 0, 297, 1301, 1, 0, 0, 0, 299, 1303, 1, 0, 0, 0, 301, 1305, 1, 0, 0, 0, 303, 1308, 1, 0, 0, 0, 305, 1310, 1, 0, 0, 0, 307, 1312, 1, 0, 0, 0, 309, 1314, 1, 0, 0, 0, 311, 1317, 1, 0, 0, 0, 313, 1319, 1, 0, 0, 0, 315, 1322, 1, 0, 0, 0, 317, 1324, 1, 0, 0, 0, 319, 1326, 1, 0, 0, 0, 321, 1329, 1, 0, 0, 0, 323, 1333, 1, 0, 0, 0, 325, 1337, 1, 0, 0, 0, 327, 1339, 1, 0, 0, 0, 329, 1341, 1, 0, 0, 0, 331, 1344, 1, 0, 0, 0, 333, 1350, 1, 0, 0, 0, 335, 1352, 1, 0, 0, 0, 337, 1356, 1, 0, 0, 0, 339, 1359, 1, 0, 0, 0, 341, 1362, 1, 0, 0, 0, 343, 1365, 1, 0, 0, 0, 345, 1367, 1, 0, 0, 0, 347, 1369, 1, 0, 0, 0, 349, 1371, 1, 0, 0, 0, 351, 1373, 1, 0, 0, 0, 353, 1378, 1, 0, 0, 0, 355, 1383, 1, 0, 0, 0, 357, 1385, 1, 0, 0, 0, 359, 1387, 1, 0, 0, 0, 361, 1390, 1, 0, 0, 0, 363, 1394, 1, 0, 0, 0, 365, 1396, 1, 0, 0, 0, 367, 1398, 1, 0, 0, 0, 369, 1400, 1, 0, 0, 0, 371, 1402, 1, 0, 0, 0, 373, 1404, 1, 0, 0, 0, 375, 1422, 1, 0, 0, 0, 377, 1435, 1, 0, 0, 0, 379, 1450, 1, 0, 0, 0, 381, 1454, 1, 0, 0, 0, 383, 1458, 1, 0, 0, 0, 385, 1468, 1, 0, 0, 0, 387, 1472, 1, 0, 0, 0, 389, 390, 3, 229, 113, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 251, 124, 0, 392, 4, 1, 0, 0, 0, 393, 394, 3, 229, 113, 0, 394, 395, 3, 255, 126, 0, 395, 396, 3, 235, 116, 0, 396, 6, 1, 0, 0, 0, 397, 398, 3, 229, 113, 0, 398, 399, 3, 255, 126, 0, 399, 400, 3, 267, 132, 0, 400, 401, 3, 245, 121, 0, 401, 8, 1, 0, 0, 0, 402, 403, 3, 229, 113, 0, 403, 404, 3, 255, 126, 0, 404, 405, 3, 277, 137, 0, 405, 10, 1, 0, 0, 0, 406, 407, 3, 229, 113, 0, 407, 408, 3, 263, 130, 0, 408, 409, 3, 263, 130, 0, 409, 410, 3, 229, 113, 0, 410, 411, 3, 277, 137, 0, 411, 12, 1, 0, 0, 0, 412, 413, 3, 229, 113, 0, 413, 414, 3, 265, 131, 0, 414, 14, 1, 0, 0, 0, 415, 416, 3, 229, 113, 0, 416, 417, 3, 265, 131, 0, 417, 418, 3, 233, 115, 0, 418, 430, 1, 0, 0, 0, 419, 420, 3, 229, 113, 0, 420, 421, 3, 265, 131, 0, 421, 422, 3, 233, 115, 0, 422, 423, 3, 237, 117, 0, 423, 424, 3, 255, 126, 0, 424, 425, 3, 235, 116, 0, 425, 426, 3, 245, 121, 0, 426, 427, 3, 255, 126, 0, 427, 428, 3, 241, 119, 0, 428, 430, 1, 0, 0, 0, 429, 415, 1, 0, 0, 0, 429, 419, 1, 0, 0, 0, 430, 16, 1, 0, 0, 0, 431, 432, 3, 229, 113, 0, 432, 433, 3, 265, 131, 0, 433, 434, 3, 257, 127, 0, 434, 435, 3, 239, 118, 0, 435, 18, 1, 0, 0, 0, 436, 437, 3, 231, 114, 0, 437, 438, 3, 237, 117, 0, 438, 439, 3, 267, 132, 0, 439, 440, 3, 273, 135, 0, 440, 441, 3, 237, 117, 0, 441, 442, 3, 237, 117, 0, 442, 443, 3, 255, 126, 0, 443, 20, 1, 0, 0, 0, 444, 445, 3, 231, 114, 0, 445, 446, 3, 257, 127, 0, 446, 447, 3, 267, 132, 0, 447, 448, 3, 243, 120, 0, 448, 22, 1, 0, 0, 0, 449, 450, 3, 231, 114, 0, 450, 451, 3, 277, 137, 0, 451, 24, 1, 0, 0, 0, 452, 453, 3, 233, 115, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 265, 131, 0, 455, 456, 3, 237, 117, 0, 456, 26, 1, 0, 0, 0, 457, 458, 3, 233, 115, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 265, 131, 0, 460, 461, 3, 267, 132, 0, 461, 28, 1, 0, 0, 0, 462, 463, 3, 233, 115, 0, 463, 464, 3, 229, 113, 0, 464, 465, 3, 267, 132, 0, 465, 466, 3, 233, 115, 0, 466, 467, 3, 243, 120, 0, 467, 30, 1, 0, 0, 0, 468, 469, 3, 233, 115, 0, 469, 470, 3, 257, 127, 0, 470, 471, 3, 243, 120, 0, 471, 472, 3, 257, 127, 0, 472, 473, 3, 263, 130, 0, 473, 474, 3, 267, 132, 0, 474, 32, 1, 0, 0, 0, 475, 476, 3, 233, 115, 0, 476, 477, 3, 257, 127, 0, 477, 478, 3, 251, 124, 0, 478, 479, 3, 251, 124, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 267, 132, 0, 481, 482, 3, 237, 117, 0, 482, 34, 1, 0, 0, 0, 483, 484, 3, 233, 115, 0, 484, 485, 3, 263, 130, 0, 485, 486, 3, 257, 127, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 265, 131, 0, 488, 36, 1, 0, 0, 0, 489, 490, 3, 233, 115, 0, 490, 491, 3, 269, 133, 0, 491, 492, 3, 231, 114, 0, 492, 493, 3, 237, 117, 0, 493, 38, 1, 0, 0, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 269, 133, 0, 496, 497, 3, 263, 130, 0, 497, 498, 3, 263, 130, 0, 498, 499, 3, 237, 117, 0, 499, 500, 3, 255, 126, 0, 500, 501, 3, 267, 132, 0, 501, 40, 1, 0, 0, 0, 502, 503, 3, 235, 116, 0, 503, 504, 3, 229, 113, 0, 504, 505, 3, 267, 132, 0, 505, 506, 3, 237, 117, 0, 506, 42, 1, 0, 0, 0, 507, 508, 3, 235, 116, 0, 508, 509, 3, 229, 113, 0, 509, 510, 3, 277, 137, 0, 510, 44, 1, 0, 0, 0, 511, 512, 3, 235, 116, 0, 512, 513, 3, 237, 117, 0, 513, 514, 3, 265, 131, 0, 514, 515, 3, 233, 115, 0, 515, 46, 1, 0, 0, 0, 516, 517, 3, 235, 116, 0, 517, 518, 3, 237, 117, 0, 518, 519, 3, 265, 131, 0, 519, 520, 3, 233, 115, 0, 520, 521, 3, 237, 117, 0, 521, 522, 3, 255, 126, 0, 522, 523, 3, 235, 116, 0, 523, 524, 3, 245, 121, 0, 524, 525, 3, 255, 126, 0, 525, 526, 3, 241, 119, 0, 526, 48, 1, 0, 0, 0, 527, 528, 3, 235, 116, 0, 528, 529, 3, 245, 121, 0, 529, 530, 3, 265, 131, 0, 530, 531, 3, 267, 132, 0, 531, 532, 3, 245, 121, 0, 532, 533, 3, 255, 126, 0, 533, 534, 3, 233, 115, 0, 534, 535, 3, 267, 132, 0, 535, 50, 1, 0, 0, 0, 536, 537, 3, 237, 117, 0, 537, 538, 3, 251, 124, 0, 538, 539, 3, 265, 131, 0, 539, 540, 3, 237, 117, 0, 540, 52, 1, 0, 0, 0, 541, 542, 3, 237, 117, 0, 542, 543, 3, 255, 126, 0, 543, 544, 3, 235, 116, 0, 544, 54, 1, 0, 0, 0, 545, 546, 3, 237, 117, 0, 546, 547, 3, 275, 136, 0, 547, 548, 3, 233, 115, 0, 548, 549, 3, 237, 117, 0, 549, 550, 3, 259, 128, 0, 550, 551, 3, 267, 132, 0, 551, 56, 1, 0, 0, 0, 552, 553, 3, 237, 117, 0, 553, 554, 3, 275, 136, 0, 554, 555, 3, 267, 132, 0, 555, 556, 3, 263, 130, 0, 556, 557, 3, 229, 113, 0, 557, 558, 3, 233, 115, 0, 558, 559, 3, 267, 132, 0, 559, 58, 1, 0, 0, 0, 560, 561, 3, 239, 118, 0, 561, 562, 3, 245, 121, 0, 562, 563, 3, 255, 126, 0, 563, 564, 3, 229, 113, 0, 564, 565, 3, 251, 124, 0, 565, 60, 1, 0, 0, 0, 566, 567, 3, 239, 118, 0, 567, 568, 3, 245, 121, 0, 568, 569, 3, 255, 126, 0, 569, 570, 3, 229, 113, 0, 570, 571, 3, 251, 124, 0, 571, 572, 3, 251, 124, 0, 572, 573, 3, 277, 137, 0, 573, 62, 1, 0, 0, 0, 574, 575, 3, 239, 118, 0, 575, 576, 3, 245, 121, 0, 576, 577, 3, 263, 130, 0, 577, 578, 3, 265, 131, 0, 578, 579, 3, 267, 132, 0, 579, 64, 1, 0, 0, 0, 580, 581, 3, 239, 118, 0, 581, 582, 3, 255, 126, 0, 582, 66, 1, 0, 0, 0, 583, 584, 3, 239, 118, 0, 584, 585, 3, 257, 127, 0, 585, 586, 3, 251, 124, 0, 586, 587, 3, 251, 124, 0, 587, 588, 3, 257, 127, 0, 588, 589, 3, 273, 135, 0, 589, 590, 3, 245, 121, 0, 590, 591, 3, 255, 126, 0, 591, 592, 3, 241, 119, 0, 592, 68, 1, 0, 0, 0, 593, 594, 3, 239, 118, 0, 594, 595, 3, 257, 127, 0, 595, 596, 3, 263, 130, 0, 596, 70, 1, 0, 0, 0, 597, 598, 3, 239, 118, 0, 598, 599, 3, 263, 130, 0, 599, 600, 3, 257, 127, 0, 600, 601, 3, 253, 125, 0, 601, 72, 1, 0, 0, 0, 602, 603, 3, 239, 118, 0, 603, 604, 3, 269, 133, 0, 604, 605, 3, 251, 124, 0, 605, 606, 3, 251, 124, 0, 606, 74, 1, 0, 0, 0, 607, 608, 3, 239, 118, 0, 608, 609, 3, 269, 133, 0, 609, 610, 3, 255, 126, 0, 610, 76, 1, 0, 0, 0, 611, 612, 3, 241, 119, 0, 612, 613, 3, 263, 130, 0, 613, 614, 3, 257, 127, 0, 614, 615, 3, 269, 133, 0, 615, 616, 3, 259, 128, 0, 616, 78, 1, 0, 0, 0, 617, 618, 3, 243, 120, 0, 618, 619, 3, 229, 113, 0, 619, 620, 3, 271, 134, 0, 620, 621, 3, 245, 121, 0, 621, 622, 3, 255, 126, 0, 622, 623, 3, 241, 119, 0, 623, 80, 1, 0, 0, 0, 624, 625, 3, 243, 120, 0, 625, 626, 3, 257, 127, 0, 626, 627, 3, 269, 133, 0, 627, 628, 3, 263, 130, 0, 628, 82, 1, 0, 0, 0, 629, 630, 3, 245, 121, 0, 630, 631, 3, 235, 116, 0, 631, 84, 1, 0, 0, 0, 632, 633, 3, 245, 121, 0, 633, 634, 3, 239, 118, 0, 634, 86, 1, 0, 0, 0, 635, 636, 3, 245, 121, 0, 636, 637, 3, 251, 124, 0, 637, 638, 3, 245, 121, 0, 638, 639, 3, 249, 123, 0, 639, 640, 3, 237, 117, 0, 640, 88, 1, 0, 0, 0, 641, 642, 3, 245, 121, 0, 642, 643, 3, 255, 126, 0, 643, 90, 1, 0, 0, 0, 644, 645, 3, 245, 121, 0, 645, 646, 3, 255, 126, 0, 646, 647, 3, 239, 118, 0, 647, 658, 1, 0, 0, 0, 648, 649, 3, 245, 121, 0, 649, 650, 3, 255, 126, 0, 650, 651, 3, 239, 118, 0, 651, 652, 3, 245, 121, 0, 652, 653, 3, 255, 126, 0, 653, 654, 3, 245, 121, 0, 654, 655, 3, 267, 132, 0, 655, 656, 3, 277, 137, 0, 656, 658, 1, 0, 0, 0, 657, 644, 1, 0, 0, 0, 657, 648, 1, 0, 0, 0, 658, 92, 1, 0, 0, 0, 659, 660, 3, 245, 121, 0, 660, 661, 3, 255, 126, 0, 661, 662, 3, 255, 126, 0, 662, 663, 3, 237, 117, 0, 663, 664, 3, 263, 130, 0, 664, 94, 1, 0, 0, 0, 665, 666, 3, 245, 121, 0, 666, 667, 3, 255, 126, 0, 667, 668, 3, 267, 132, 0, 668, 669, 3, 237, 117, 0, 669, 670, 3, 263, 130, 0, 670, 671, 3, 265, 131, 0, 671, 672, 3, 237, 117, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 267, 132, 0, 674, 96, 1, 0, 0, 0, 675, 676, 3, 245, 121, 0, 676, 677, 3, 255, 126, 0, 677, 678, 3, 267, 132, 0, 678, 679, 3, 237, 117, 0, 679, 680, 3, 263, 130, 0, 680, 681, 3, 271, 134, 0, 681, 682, 3, 229, 113, 0, 682, 683, 3, 251, 124, 0, 683, 98, 1, 0, 0, 0, 684, 685, 3, 245, 121, 0, 685, 686, 3, 265, 131, 0, 686, 100, 1, 0, 0, 0, 687, 688, 3, 247, 122, 0, 688, 689, 3, 257, 127, 0, 689, 690, 3, 245, 121, 0, 690, 691, 3, 255, 126, 0, 691, 102, 1, 0, 0, 0, 692, 693, 3, 249, 123, 0, 693, 694, 3, 237, 117, 0, 694, 695, 3, 277, 137, 0, 695, 104, 1, 0, 0, 0, 696, 697, 3, 251, 124, 0, 697, 698, 3, 229, 113, 0, 698, 699, 3, 265, 131, 0, 699, 700, 3, 267, 132, 0, 700, 106, 1, 0, 0, 0, 701, 702, 3, 251, 124, 0, 702, 703, 3, 237, 117, 0, 703, 704, 3, 229, 113, 0, 704, 705, 3, 235, 116, 0, 705, 706, 3, 245, 121, 0, 706, 707, 3, 255, 126, 0, 707, 708, 3, 241, 119, 0, 708, 108, 1, 0, 0, 0, 709, 710, 3, 251, 124, 0, 710, 711, 3, 237, 117, 0, 711, 712, 3, 239, 118, 0, 712, 713, 3, 267, 132, 0, 713, 110, 1, 0, 0, 0, 714, 715, 3, 251, 124, 0, 715, 716, 3, 237, 117, 0, 716, 717, 3, 267, 132, 0, 717, 112, 1, 0, 0, 0, 718, 719, 3, 251, 124, 0, 719, 720, 3, 245, 121, 0, 720, 721, 3, 249, 123, 0, 721, 722, 3, 237, 117, 0, 722, 114, 1, 0, 0, 0, 723, 724, 3, 251, 124, 0, 724, 725, 3, 245, 121, 0, 725, 726, 3, 253, 125, 0, 726, 727, 3, 245, 121, 0, 727, 728, 3, 267, 132, 0, 728, 116, 1, 0, 0, 0, 729, 730, 3, 253, 125, 0, 730, 731, 3, 245, 121, 0, 731, 732, 3, 255, 126, 0, 732, 733, 3, 269, 133, 0, 733, 734, 3, 267, 132, 0, 734, 735, 3, 237, 117, 0, 735, 118, 1, 0, 0, 0, 736, 737, 3, 253, 125, 0, 737, 738, 3, 257, 127, 0, 738, 739, 3, 255, 126, 0, 739, 740, 3, 267, 132, 0, 740, 741, 3, 243, 120, 0, 741, 120, 1, 0, 0, 0, 742, 743, 3, 255, 126, 0, 743, 744, 3, 229, 113, 0, 744, 745, 3, 255, 126, 0, 745, 122, 1, 0, 0, 0, 746, 747, 3, 255, 126, 0, 747, 748, 3, 257, 127, 0, 748, 749, 3, 267, 132, 0, 749, 124, 1, 0, 0, 0, 750, 751, 3, 255, 126, 0, 751, 752, 3, 269, 133, 0, 752, 753, 3, 251, 124, 0, 753, 754, 3, 251, 124, 0, 754, 126, 1, 0, 0, 0, 755, 756, 3, 255, 126, 0, 756, 757, 3, 269, 133, 0, 757, 758, 3, 251, 124, 0, 758, 759, 3, 251, 124, 0, 759, 760, 3, 265, 131, 0, 760, 128, 1, 0, 0, 0, 761, 762, 3, 257, 127, 0, 762, 763, 3, 239, 118, 0, 763, 764, 3, 239, 118, 0, 764, 765, 3, 265, 131, 0, 765, 766, 3, 237, 117, 0, 766, 767, 3, 267, 132, 0, 767, 130, 1, 0, 0, 0, 768, 769, 3, 257, 127, 0, 769, 770, 3, 255, 126, 0, 770, 132, 1, 0, 0, 0, 771, 772, 3, 257, 127, 0, 772, 773, 3, 263, 130, 0, 773, 134, 1, 0, 0, 0, 774, 775, 3, 257, 127, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 235, 116, 0, 777, 778, 3, 237, 117, 0, 778, 779, 3, 263, 130, 0, 779, 136, 1, 0, 0, 0, 780, 781, 3, 257, 127, 0, 781, 782, 3, 269, 133, 0, 782, 783, 3, 267, 132, 0, 783, 784, 3, 237, 117, 0, 784, 785, 3, 263, 130, 0, 785, 138, 1, 0, 0, 0, 786, 787, 3, 257, 127, 0, 787, 788, 3, 271, 134, 0, 788, 789, 3, 237, 117, 0, 789, 790, 3, 263, 130, 0, 790, 140, 1, 0, 0, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 229, 113, 0, 793, 794, 3, 263, 130, 0, 794, 795, 3, 267, 132, 0, 795, 796, 3, 245, 121, 0, 796, 797, 3, 267, 132, 0, 797, 798, 3, 245, 121, 0, 798, 799, 3, 257, 127, 0, 799, 800, 3, 255, 126, 0, 800, 142, 1, 0, 0, 0, 801, 802, 3, 259, 128, 0, 802, 803, 3, 263, 130, 0, 803, 804, 3, 237, 117, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 237, 117, 0, 806, 807, 3, 235, 116, 0, 807, 808, 3, 245, 121, 0, 808, 809, 3, 255, 126, 0, 809, 810, 3, 241, 119, 0, 810, 144, 1, 0, 0, 0, 811, 812, 3, 259, 128, 0, 812, 813, 3, 263, 130, 0, 813, 814, 3, 237, 117, 0, 814, 815, 3, 273, 135, 0, 815, 816, 3, 243, 120, 0, 816, 817, 3, 237, 117, 0, 817, 818, 3, 263, 130, 0, 818, 819, 3, 237, 117, 0, 819, 146, 1, 0, 0, 0, 820, 821, 3, 261, 129, 0, 821, 822, 3, 269, 133, 0, 822, 823, 3, 229, 113, 0, 823, 824, 3, 263, 130, 0, 824, 825, 3, 267, 132, 0, 825, 826, 3, 237, 117, 0, 826, 827, 3, 263, 130, 0, 827, 148, 1, 0, 0, 0, 828, 829, 3, 263, 130, 0, 829, 830, 3, 229, 113, 0, 830, 831, 3, 255, 126, 0, 831, 832, 3, 241, 119, 0, 832, 833, 3, 237, 117, 0, 833, 150, 1, 0, 0, 0, 834, 835, 3, 263, 130, 0, 835, 836, 3, 237, 117, 0, 836, 837, 3, 267, 132, 0, 837, 838, 3, 269, 133, 0, 838, 839, 3, 263, 130, 0, 839, 840, 3, 255, 126, 0, 840, 152, 1, 0, 0, 0, 841, 842, 3, 263, 130, 0, 842, 843, 3, 245, 121, 0, 843, 844, 3, 241, 119, 0, 844, 845, 3, 243, 120, 0, 845, 846, 3, 267, 132, 0, 846, 154, 1, 0, 0, 0, 847, 848, 3, 263, 130, 0, 848, 849, 3, 257, 127, 0, 849, 850, 3, 251, 124, 0, 850, 851, 3, 251, 124, 0, 851, 852, 3, 269, 133, 0, 852, 853, 3, 259, 128, 0, 853, 156, 1, 0, 0, 0, 854, 855, 3, 263, 130, 0, 855, 856, 3, 257, 127, 0, 856, 857, 3, 273, 135, 0, 857, 158, 1, 0, 0, 0, 858, 859, 3, 263, 130, 0, 859, 860, 3, 257, 127, 0, 860, 861, 3, 273, 135, 0, 861, 862, 3, 265, 131, 0, 862, 160, 1, 0, 0, 0, 863, 864, 3, 265, 131, 0, 864, 865, 3, 229, 113, 0, 865, 866, 3, 253, 125, 0, 866, 867, 3, 259, 128, 0, 867, 868, 3, 251, 124, 0, 868, 869, 3, 237, 117, 0, 869, 162, 1, 0, 0, 0, 870, 871, 3, 265, 131, 0, 871, 872, 3, 237, 117, 0, 872, 873, 3, 233, 115, 0, 873, 874, 3, 257, 127, 0, 874, 875, 3, 255, 126, 0, 875, 876, 3, 235, 116, 0, 876, 164, 1, 0, 0, 0, 877, 878, 3, 265, 131, 0, 878, 879, 3, 237, 117, 0, 879, 880, 3, 251, 124, 0, 880, 881, 3, 237, 117, 0, 881, 882, 3, 233, 115, 0, 882, 883, 3, 267, 132, 0, 883, 166, 1, 0, 0, 0, 884, 885, 3, 265, 131, 0, 885, 886, 3, 237, 117, 0, 886, 887, 3, 253, 125, 0, 887, 888, 3, 245, 121, 0, 888, 168, 1, 0, 0, 0, 889, 890, 3, 265, 131, 0, 890, 891, 3, 237, 117, 0, 891, 892, 3, 267, 132, 0, 892, 893, 3, 267, 132, 0, 893, 894, 3, 245, 121, 0, 894, 895, 3, 255, 126, 0, 895, 896, 3, 241, 119, 0, 896, 897, 3, 265, 131, 0, 897, 170, 1, 0, 0, 0, 898, 899, 3, 265, 131, 0, 899, 900, 3, 269, 133, 0, 900, 901, 3, 231, 114, 0, 901, 902, 3, 265, 131, 0, 902, 903, 3, 267, 132, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 245, 121, 0, 905, 906, 3, 255, 126, 0, 906, 907, 3, 241, 119, 0, 907, 172, 1, 0, 0, 0, 908, 909, 3, 267, 132, 0, 909, 910, 3, 243, 120, 0, 910, 911, 3, 237, 117, 0, 911, 912, 3, 255, 126, 0, 912, 174, 1, 0, 0, 0, 913, 914, 3, 267, 132, 0, 914, 915, 3, 243, 120, 0, 915, 916, 3, 263, 130, 0, 916, 917, 3, 257, 127, 0, 917, 918, 3, 273, 135, 0, 918, 176, 1, 0, 0, 0, 919, 920, 3, 267, 132, 0, 920, 921, 3, 245, 121, 0, 921, 922, 3, 237, 117, 0, 922, 923, 3, 265, 131, 0, 923, 178, 1, 0, 0, 0, 924, 925, 3, 267, 132, 0, 925, 926, 3, 245, 121, 0, 926, 927, 3, 253, 125, 0, 927, 928, 3, 237, 117, 0, 928, 929, 3, 265, 131, 0, 929, 930, 3, 267, 132, 0, 930, 931, 3, 229, 113, 0, 931, 932, 3, 253, 125, 0, 932, 933, 3, 259, 128, 0, 933, 180, 1, 0, 0, 0, 934, 935, 3, 267, 132, 0, 935, 936, 3, 257, 127, 0, 936, 182, 1, 0, 0, 0, 937, 938, 3, 267, 132, 0, 938, 939, 3, 257, 127, 0, 939, 940, 3, 259, 128, 0, 940, 184, 1, 0, 0, 0, 941, 942, 3, 267, 132, 0, 942, 943, 3, 257, 127, 0, 943, 944, 3, 267, 132, 0, 944, 945, 3, 229, 113, 0, 945, 946, 3, 251, 124, 0, 946, 947, 3, 265, 131, 0, 947, 186, 1, 0, 0, 0, 948, 949, 3, 267, 132, 0, 949, 950, 3, 263, 130, 0, 950, 951, 3, 229, 113, 0, 951, 952, 3, 245, 121, 0, 952, 953, 3, 251, 124, 0, 953, 954, 3, 245, 121, 0, 954, 955, 3, 255, 126, 0, 955, 956, 3, 241, 119, 0, 956, 188, 1, 0, 0, 0, 957, 958, 3, 267, 132, 0, 958, 959, 3, 263, 130, 0, 959, 960, 3, 245, 121, 0, 960, 961, 3, 253, 125, 0, 961, 190, 1, 0, 0, 0, 962, 963, 3, 267, 132, 0, 963, 964, 3, 263, 130, 0, 964, 965, 3, 269, 133, 0, 965, 966, 3, 255, 126, 0, 966, 967, 3, 233, 115, 0, 967, 968, 3, 229, 113, 0, 968, 969, 3, 267, 132, 0, 969, 970, 3, 237, 117, 0, 970, 192, 1, 0, 0, 0, 971, 972, 3, 267, 132, 0, 972, 973, 3, 263, 130, 0, 973, 974, 3, 277, 137, 0, 974, 194, 1, 0, 0, 0, 975, 976, 3, 269, 133, 0, 976, 977, 3, 255, 126, 0, 977, 978, 3, 231, 114, 0, 978, 979, 3, 257, 127, 0, 979, 980, 3, 269, 133, 0, 980, 981, 3, 255, 126, 0, 981, 982, 3, 235, 116, 0, 982, 983, 3, 237, 117, 0, 983, 984, 3, 235, 116, 0, 984, 196, 1, 0, 0, 0, 985, 986, 3, 269, 133, 0, 986, 987, 3, 255, 126, 0, 987, 988, 3, 245, 121, 0, 988, 989, 3, 257, 127, 0, 989, 990, 3, 255, 126, 0, 990, 198, 1, 0, 0, 0, 991, 992, 3, 269, 133, 0, 992, 993, 3, 265, 131, 0, 993, 994, 3, 245, 121, 0, 994, 995, 3, 255, 126, 0, 995, 996, 3, 241, 119, 0, 996, 200, 1, 0, 0, 0, 997, 998, 3, 273, 135, 0, 998, 999, 3, 237, 117, 0, 999, 1000, 3, 237, 117, 0, 1000, 1001, 3, 249, 123, 0, 1001, 202, 1, 0, 0, 0, 1002, 1003, 3, 273, 135, 0, 1003, 1004, 3, 243, 120, 0, 1004, 1005, 3, 237, 117, 0, 1005, 1006, 3, 255, 126, 0, 1006, 204, 1, 0, 0, 0, 1007, 1008, 3, 273, 135, 0, 1008, 1009, 3, 243, 120, 0, 1009, 1010, 3, 237, 117, 0, 1010, 1011, 3, 263, 130, 0, 1011, 1012, 3, 237, 117, 0, 1012, 206, 1, 0, 0, 0, 1013, 1014, 3, 273, 135, 0, 1014, 1015, 3, 243, 120, 0, 1015, 1016, 3, 245, 121, 0, 1016, 1017, 3, 251, 124, 0, 1017, 1018, 3, 237, 117, 0, 1018, 208, 1, 0, 0, 0, 1019, 1020, 3, 273, 135, 0, 1020, 1021, 3, 245, 121, 0, 1021, 1022, 3, 255, 126, 0, 1022, 1023, 3, 235, 116, 0, 1023, 1024, 3, 257, 127, 0, 1024, 1025, 3, 273, 135, 0, 1025, 210, 1, 0, 0, 0, 1026, 1027, 3, 273, 135, 0, 1027, 1028, 3, 245, 121, 0, 1028, 1029, 3, 267, 132, 0, 1029, 1030, 3, 243, 120, 0, 1030, 212, 1, 0, 0, 0, 1031, 1032, 3, 277, 137, 0, 1032, 1033, 3, 237, 117, 0, 1033, 1034, 3, 229, 113, 0, 1034, 1035, 3, 263, 130, 0, 1035, 1042, 1, 0, 0, 0, 1036, 1037, 3, 277, 137, 0, 1037, 1038, 3, 277, 137, 0, 1038, 1039, 3, 277, 137, 0, 1039, 1040, 3, 277, 137, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1031, 1, 0, 0, 0, 1041, 1036, 1, 0, 0, 0, 1042, 214, 1, 0, 0, 0, 1043, 1044, 3, 295, 146, 0, 1044, 1045, 3, 231, 114, 0, 1045, 1071, 1, 0, 0, 0, 1046, 1047, 3, 295, 146, 0, 1047, 1048, 3, 239, 118, 0, 1048, 1071, 1, 0, 0, 0, 1049, 1050, 3, 295, 146, 0, 1050, 1051, 3, 263, 130, 0, 1051, 1071, 1, 0, 0, 0, 1052, 1053, 3, 295, 146, 0, 1053, 1054, 3, 255, 126, 0, 1054, 1071, 1, 0, 0, 0, 1055, 1056, 3, 295, 146, 0, 1056, 1057, 3, 267, 132, 0, 1057, 1071, 1, 0, 0, 0, 1058, 1059, 3, 295, 146, 0, 1059, 1060, 5, 48, 0, 0, 1060, 1071, 1, 0, 0, 0, 1061, 1062, 3, 295, 146, 0, 1062, 1063, 3, 229, 113, 0, 1063, 1071, 1, 0, 0, 0, 1064, 1065, 3, 295, 146, 0, 1065, 1066, 3, 271, 134, 0, 1066, 1071, 1, 0, 0, 0, 1067, 1068, 3, 295, 146, 0, 1068, 1069, 3, 295, 146, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1043, 1, 0, 0, 0, 1070, 1046, 1, 0, 0, 0, 1070, 1049, 1, 0, 0, 0, 1070, 1052, 1, 0, 0, 0, 1070, 1055, 1, 0, 0, 0, 1070, 1058, 1, 0, 0, 0, 1070, 1061, 1, 0, 0, 0, 1070, 1064, 1, 0, 0, 0, 1070, 1067, 1, 0, 0, 0, 1071, 216, 1, 0, 0, 0, 1072, 1076, 3, 281, 139, 0, 1073, 1076, 3, 371, 184, 0, 1074, 1076, 3, 305, 151, 0, 1075, 1072, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 1083, 1, 0, 0, 0, 1077, 1082, 3, 281, 139, 0, 1078, 1082, 3, 371, 184, 0, 1079, 1082, 3, 285, 141, 0, 1080, 1082, 3, 305, 151, 0, 1081, 1077, 1, 0, 0, 0, 1081, 1078, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1119, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1086, 1097, 3, 293, 145, 0, 1087, 1096, 8, 0, 0, 0, 1088, 1096, 3, 215, 106, 0, 1089, 1090, 3, 295, 146, 0, 1090, 1091, 3, 355, 176, 0, 1091, 1096, 1, 0, 0, 0, 1092, 1093, 3, 293, 145, 0, 1093, 1094, 3, 293, 145, 0, 1094, 1096, 1, 0, 0, 0, 1095, 1087, 1, 0, 0, 0, 1095, 1088, 1, 0, 0, 0, 1095, 1089, 1, 0, 0, 0, 1095, 1092, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1101, 3, 293, 145, 0, 1101, 1119, 1, 0, 0, 0, 1102, 1113, 3, 349, 173, 0, 1103, 1112, 8, 1, 0, 0, 1104, 1112, 3, 215, 106, 0, 1105, 1106, 3, 295, 146, 0, 1106, 1107, 3, 349, 173, 0, 1107, 1112, 1, 0, 0, 0, 1108, 1109, 3, 349, 173, 0, 1109, 1110, 3, 349, 173, 0, 1110, 1112, 1, 0, 0, 0, 1111, 1103, 1, 0, 0, 0, 1111, 1104, 1, 0, 0, 0, 1111, 1105, 1, 0, 0, 0, 1111, 1108, 1, 0, 0, 0, 1112, 1115, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1113, 1, 0, 0, 0, 1116, 1117, 3, 349, 173, 0, 1117, 1119, 1, 0, 0, 0, 1118, 1075, 1, 0, 0, 0, 1118, 1086, 1, 0, 0, 0, 1118, 1102, 1, 0, 0, 0, 1119, 218, 1, 0, 0, 0, 1120, 1121, 3, 225, 111, 0, 1121, 1125, 3, 307, 152, 0, 1122, 1124, 3, 287, 142, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1123, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1130, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1128, 1131, 3, 259, 128, 0, 1129, 1131, 3, 237, 117, 0, 1130, 1128, 1, 0, 0, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1134, 1, 0, 0, 0, 1132, 1135, 3, 345, 171, 0, 1133, 1135, 3, 303, 150, 0, 1134, 1132, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1137, 1, 0, 0, 0, 1136, 1138, 3, 285, 141, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1197, 1, 0, 0, 0, 1141, 1144, 3, 225, 111, 0, 1142, 1145, 3, 259, 128, 0, 1143, 1145, 3, 237, 117, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1143, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1149, 3, 345, 171, 0, 1147, 1149, 3, 303, 150, 0, 1148, 1146, 1, 0, 0, 0, 1148, 1147, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1151, 1, 0, 0, 0, 1150, 1152, 3, 285, 141, 0, 1151, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1197, 1, 0, 0, 0, 1155, 1156, 3, 223, 110, 0, 1156, 1160, 3, 307, 152, 0, 1157, 1159, 3, 285, 141, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1162, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1163, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1163, 1166, 3, 237, 117, 0, 1164, 1167, 3, 345, 171, 0, 1165, 1167, 3, 303, 150, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1169, 1, 0, 0, 0, 1168, 1170, 3, 285, 141, 0, 1169, 1168, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1197, 1, 0, 0, 0, 1173, 1174, 3, 307, 152, 0, 1174, 1175, 3, 223, 110, 0, 1175, 1178, 3, 237, 117, 0, 1176, 1179, 3, 345, 171, 0, 1177, 1179, 3, 303, 150, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1181, 1, 0, 0, 0, 1180, 1182, 3, 285, 141, 0, 1181, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1197, 1, 0, 0, 0, 1185, 1186, 3, 223, 110, 0, 1186, 1189, 3, 237, 117, 0, 1187, 1190, 3, 345, 171, 0, 1188, 1190, 3, 303, 150, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1193, 3, 285, 141, 0, 1192, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1192, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1197, 1, 0, 0, 0, 1196, 1120, 1, 0, 0, 0, 1196, 1141, 1, 0, 0, 0, 1196, 1155, 1, 0, 0, 0, 1196, 1173, 1, 0, 0, 0, 1196, 1185, 1, 0, 0, 0, 1197, 220, 1, 0, 0, 0, 1198, 1200, 5, 48, 0, 0, 1199, 1201, 3, 283, 140, 0, 1200, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 222, 1, 0, 0, 0, 1204, 1206, 3, 285, 141, 0, 1205, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1207, 1208, 1, 0, 0, 0, 1208, 224, 1, 0, 0, 0, 1209, 1210, 5, 48, 0, 0, 1210, 1212, 3, 275, 136, 0, 1211, 1213, 3, 287, 142, 0, 1212, 1211, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1212, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 226, 1, 0, 0, 0, 1216, 1227, 3, 355, 176, 0, 1217, 1226, 8, 2, 0, 0, 1218, 1226, 3, 215, 106, 0, 1219, 1220, 3, 295, 146, 0, 1220, 1221, 3, 355, 176, 0, 1221, 1226, 1, 0, 0, 0, 1222, 1223, 3, 355, 176, 0, 1223, 1224, 3, 355, 176, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1219, 1, 0, 0, 0, 1225, 1222, 1, 0, 0, 0, 1226, 1229, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1230, 1231, 3, 355, 176, 0, 1231, 228, 1, 0, 0, 0, 1232, 1233, 7, 3, 0, 0, 1233, 230, 1, 0, 0, 0, 1234, 1235, 7, 4, 0, 0, 1235, 232, 1, 0, 0, 0, 1236, 1237, 7, 5, 0, 0, 1237, 234, 1, 0, 0, 0, 1238, 1239, 7, 6, 0, 0, 1239, 236, 1, 0, 0, 0, 1240, 1241, 7, 7, 0, 0, 1241, 238, 1, 0, 0, 0, 1242, 1243, 7, 8, 0, 0, 1243, 240, 1, 0, 0, 0, 1244, 1245, 7, 9, 0, 0, 1245, 242, 1, 0, 0, 0, 1246, 1247, 7, 10, 0, 0, 1247, 244, 1, 0, 0, 0, 1248, 1249, 7, 11, 0, 0, 1249, 246, 1, 0, 0, 0, 1250, 1251, 7, 12, 0, 0, 1251, 248, 1, 0, 0, 0, 1252, 1253, 7, 13, 0, 0, 1253, 250, 1, 0, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 252, 1, 0, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 254, 1, 0, 0, 0, 1258, 1259, 7, 16, 0, 0, 1259, 256, 1, 0, 0, 0, 1260, 1261, 7, 17, 0, 0, 1261, 258, 1, 0, 0, 0, 1262, 1263, 7, 18, 0, 0, 1263, 260, 1, 0, 0, 0, 1264, 1265, 7, 19, 0, 0, 1265, 262, 1, 0, 0, 0, 1266, 1267, 7, 20, 0, 0, 1267, 264, 1, 0, 0, 0, 1268, 1269, 7, 21, 0, 0, 1269, 266, 1, 0, 0, 0, 1270, 1271, 7, 22, 0, 0, 1271, 268, 1, 0, 0, 0, 1272, 1273, 7, 23, 0, 0, 1273, 270, 1, 0, 0, 0, 1274, 1275, 7, 24, 0, 0, 1275, 272, 1, 0, 0, 0, 1276, 1277, 7, 25, 0, 0, 1277, 274, 1, 0, 0, 0, 1278, 1279, 7, 26, 0, 0, 1279, 276, 1, 0, 0, 0, 1280, 1281, 7, 27, 0, 0, 1281, 278, 1, 0, 0, 0, 1282, 1283, 7, 28, 0, 0, 1283, 280, 1, 0, 0, 0, 1284, 1285, 7, 29, 0, 0, 1285, 282, 1, 0, 0, 0, 1286, 1287, 7, 30, 0, 0, 1287, 284, 1, 0, 0, 0, 1288, 1289, 7, 31, 0, 0, 1289, 286, 1, 0, 0, 0, 1290, 1291, 7, 32, 0, 0, 1291, 288, 1, 0, 0, 0, 1292, 1293, 5, 45, 0, 0, 1293, 1294, 5, 62, 0, 0, 1294, 290, 1, 0, 0, 0, 1295, 1296, 5, 42, 0, 0, 1296, 292, 1, 0, 0, 0, 1297, 1298, 5, 96, 0, 0, 1298, 294, 1, 0, 0, 0, 1299, 1300, 5, 92, 0, 0, 1300, 296, 1, 0, 0, 0, 1301, 1302, 5, 58, 0, 0, 1302, 298, 1, 0, 0, 0, 1303, 1304, 5, 44, 0, 0, 1304, 300, 1, 0, 0, 0, 1305, 1306, 5, 124, 0, 0, 1306, 1307, 5, 124, 0, 0, 1307, 302, 1, 0, 0, 0, 1308, 1309, 5, 45, 0, 0, 1309, 304, 1, 0, 0, 0, 1310, 1311, 5, 36, 0, 0, 1311, 306, 1, 0, 0, 0, 1312, 1313, 5, 46, 0, 0, 1313, 308, 1, 0, 0, 0, 1314, 1315, 5, 61, 0, 0, 1315, 1316, 5, 61, 0, 0, 1316, 310, 1, 0, 0, 0, 1317, 1318, 5, 61, 0, 0, 1318, 312, 1, 0, 0, 0, 1319, 1320, 5, 62, 0, 0, 1320, 1321, 5, 61, 0, 0, 1321, 314, 1, 0, 0, 0, 1322, 1323, 5, 62, 0, 0, 1323, 316, 1, 0, 0, 0, 1324, 1325, 5, 35, 0, 0, 1325, 318, 1, 0, 0, 0, 1326, 1327, 5, 126, 0, 0, 1327, 1328, 5, 42, 0, 0, 1328, 320, 1, 0, 0, 0, 1329, 1330, 5, 61, 0, 0, 1330, 1331, 5, 126, 0, 0, 1331, 1332, 5, 42, 0, 0, 1332, 322, 1, 0, 0, 0, 1333, 1334, 5, 123, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 6, 160, 0, 0, 1336, 324, 1, 0, 0, 0, 1337, 1338, 5, 91, 0, 0, 1338, 326, 1, 0, 0, 0, 1339, 1340, 5, 40, 0, 0, 1340, 328, 1, 0, 0, 0, 1341, 1342, 5, 60, 0, 0, 1342, 1343, 5, 61, 0, 0, 1343, 330, 1, 0, 0, 0, 1344, 1345, 5, 60, 0, 0, 1345, 332, 1, 0, 0, 0, 1346, 1347, 5, 33, 0, 0, 1347, 1351, 5, 61, 0, 0, 1348, 1349, 5, 60, 0, 0, 1349, 1351, 5, 62, 0, 0, 1350, 1346, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1351, 334, 1, 0, 0, 0, 1352, 1353, 5, 33, 0, 0, 1353, 1354, 5, 126, 0, 0, 1354, 1355, 5, 42, 0, 0, 1355, 336, 1, 0, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 1358, 5, 126, 0, 0, 1358, 338, 1, 0, 0, 0, 1359, 1360, 5, 63, 0, 0, 1360, 1361, 5, 46, 0, 0, 1361, 340, 1, 0, 0, 0, 1362, 1363, 5, 63, 0, 0, 1363, 1364, 5, 63, 0, 0, 1364, 342, 1, 0, 0, 0, 1365, 1366, 5, 37, 0, 0, 1366, 344, 1, 0, 0, 0, 1367, 1368, 5, 43, 0, 0, 1368, 346, 1, 0, 0, 0, 1369, 1370, 5, 63, 0, 0, 1370, 348, 1, 0, 0, 0, 1371, 1372, 5, 34, 0, 0, 1372, 350, 1, 0, 0, 0, 1373, 1374, 5, 102, 0, 0, 1374, 1375, 5, 39, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 174, 1, 0, 1377, 352, 1, 0, 0, 0, 1378, 1379, 5, 70, 0, 0, 1379, 1380, 5, 39, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 175, 2, 0, 1382, 354, 1, 0, 0, 0, 1383, 1384, 5, 39, 0, 0, 1384, 356, 1, 0, 0, 0, 1385, 1386, 5, 126, 0, 0, 1386, 358, 1, 0, 0, 0, 1387, 1388, 5, 61, 0, 0, 1388, 1389, 5, 126, 0, 0, 1389, 360, 1, 0, 0, 0, 1390, 1391, 5, 125, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 3, 0, 1393, 362, 1, 0, 0, 0, 1394, 1395, 5, 93, 0, 0, 1395, 364, 1, 0, 0, 0, 1396, 1397, 5, 41, 0, 0, 1397, 366, 1, 0, 0, 0, 1398, 1399, 5, 59, 0, 0, 1399, 368, 1, 0, 0, 0, 1400, 1401, 5, 47, 0, 0, 1401, 370, 1, 0, 0, 0, 1402, 1403, 5, 95, 0, 0, 1403, 372, 1, 0, 0, 0, 1404, 1405, 5, 47, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1410, 1, 0, 0, 0, 1407, 1409, 9, 0, 0, 0, 1408, 1407, 1, 0, 0, 0, 1409, 1412, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1413, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1413, 1414, 5, 42, 0, 0, 1414, 1415, 5, 47, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 4, 0, 1417, 374, 1, 0, 0, 0, 1418, 1419, 5, 45, 0, 0, 1419, 1423, 5, 45, 0, 0, 1420, 1421, 5, 47, 0, 0, 1421, 1423, 5, 47, 0, 0, 1422, 1418, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1427, 1, 0, 0, 0, 1424, 1426, 8, 33, 0, 0, 1425, 1424, 1, 0, 0, 0, 1426, 1429, 1, 0, 0, 0, 1427, 1425, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1430, 1432, 7, 34, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 6, 186, 4, 0, 1434, 376, 1, 0, 0, 0, 1435, 1436, 7, 35, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 6, 187, 5, 0, 1438, 378, 1, 0, 0, 0, 1439, 1451, 8, 36, 0, 0, 1440, 1451, 3, 215, 106, 0, 1441, 1442, 3, 295, 146, 0, 1442, 1443, 3, 355, 176, 0, 1443, 1451, 1, 0, 0, 0, 1444, 1445, 3, 295, 146, 0, 1445, 1446, 3, 323, 160, 0, 1446, 1451, 1, 0, 0, 0, 1447, 1448, 3, 355, 176, 0, 1448, 1449, 3, 355, 176, 0, 1449, 1451, 1, 0, 0, 0, 1450, 1439, 1, 0, 0, 0, 1450, 1440, 1, 0, 0, 0, 1450, 1441, 1, 0, 0, 0, 1450, 1444, 1, 0, 0, 0, 1450, 1447, 1, 0, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1450, 1, 0, 0, 0, 1452, 1453, 1, 0, 0, 0, 1453, 380, 1, 0, 0, 0, 1454, 1455, 3, 323, 160, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 189, 0, 0, 1457, 382, 1, 0, 0, 0, 1458, 1459, 3, 355, 176, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 190, 6, 0, 1461, 1462, 6, 190, 3, 0, 1462, 384, 1, 0, 0, 0, 1463, 1469, 8, 37, 0, 0, 1464, 1469, 3, 215, 106, 0, 1465, 1466, 3, 295, 146, 0, 1466, 1467, 3, 323, 160, 0, 1467, 1469, 1, 0, 0, 0, 1468, 1463, 1, 0, 0, 0, 1468, 1464, 1, 0, 0, 0, 1468, 1465, 1, 0, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1468, 1, 0, 0, 0, 1470, 1471, 1, 0, 0, 0, 1471, 386, 1, 0, 0, 0, 1472, 1473, 3, 323, 160, 0, 1473, 1474, 1, 0, 0, 0, 1474, 1475, 6, 192, 0, 0, 1475, 388, 1, 0, 0, 0, 44, 0, 1, 2, 429, 657, 1041, 1070, 1075, 1081, 1083, 1095, 1097, 1111, 1113, 1118, 1125, 1130, 1134, 1139, 1144, 1148, 1153, 1160, 1166, 1171, 1178, 1183, 1189, 1194, 1196, 1202, 1207, 1214, 1225, 1227, 1350, 1410, 1422, 1427, 1431, 1450, 1452, 1468, 1470, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 147, 0] \ No newline at end of file diff --git a/hogql_parser/HogQLLexer.tokens b/hogql_parser/HogQLLexer.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/hogql_parser/HogQLLexer.tokens +++ b/hogql_parser/HogQLLexer.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/hogql_parser/HogQLParser.cpp b/hogql_parser/HogQLParser.cpp index 4b0766a579cd5..d964e54b51e2c 100644 --- a/hogql_parser/HogQLParser.cpp +++ b/hogql_parser/HogQLParser.cpp @@ -56,16 +56,17 @@ void hogqlparserParserInitialize() { "statement", "returnStmt", "throwStmt", "catchBlock", "tryCatchStmt", "ifStmt", "whileStmt", "forStmt", "forInStmt", "funcStmt", "varAssignment", "exprStmt", "emptyStmt", "block", "kvPair", "kvPairList", "select", - "selectUnionStmt", "selectStmtWithParens", "selectStmt", "withClause", - "topClause", "fromClause", "arrayJoinClause", "windowClause", "prewhereClause", - "whereClause", "groupByClause", "havingClause", "orderByClause", "projectionOrderByClause", - "limitAndOffsetClause", "offsetOnlyClause", "settingsClause", "joinExpr", - "joinOp", "joinOpCross", "joinConstraintClause", "sampleClause", "orderExprList", - "orderExpr", "ratioExpr", "settingExprList", "settingExpr", "windowExpr", - "winPartitionByClause", "winOrderByClause", "winFrameClause", "winFrameExtend", - "winFrameBound", "expr", "columnTypeExpr", "columnExprList", "columnExpr", - "columnLambdaExpr", "hogqlxTagElement", "hogqlxTagAttribute", "withExprList", - "withExpr", "columnIdentifier", "nestedIdentifier", "tableExpr", "tableFunctionExpr", + "selectStmtWithParens", "subsequentSelectSetClause", "selectSetStmt", + "selectStmt", "withClause", "topClause", "fromClause", "arrayJoinClause", + "windowClause", "prewhereClause", "whereClause", "groupByClause", + "havingClause", "orderByClause", "projectionOrderByClause", "limitAndOffsetClause", + "offsetOnlyClause", "settingsClause", "joinExpr", "joinOp", "joinOpCross", + "joinConstraintClause", "sampleClause", "orderExprList", "orderExpr", + "ratioExpr", "settingExprList", "settingExpr", "windowExpr", "winPartitionByClause", + "winOrderByClause", "winFrameClause", "winFrameExtend", "winFrameBound", + "expr", "columnTypeExpr", "columnExprList", "columnExpr", "columnLambdaExpr", + "hogqlxTagElement", "hogqlxTagAttribute", "withExprList", "withExpr", + "columnIdentifier", "nestedIdentifier", "tableExpr", "tableFunctionExpr", "tableIdentifier", "tableArgList", "databaseIdentifier", "floatingLiteral", "numberLiteral", "literal", "interval", "keyword", "keywordForAlias", "alias", "identifier", "enumValue", "placeholder", "string", "templateString", @@ -78,30 +79,30 @@ void hogqlparserParserInitialize() { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", "'\\'", - "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", "'>='", - "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", "'<'", - "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", "'+'", - "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", "'}'", - "']'", "')'", "';'", "'/'", "'_'" + "", "", "", "", "", "", "", "", "", "", "", "", "'->'", "'*'", "'`'", + "'\\'", "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", "'='", + "'>='", "'>'", "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", + "'<'", "", "'!~*'", "'!~'", "'\\u003F.'", "'\\u003F\\u003F'", "'%'", + "'+'", "'\\u003F'", "'\"'", "'f''", "'F''", "'''", "'~'", "'=~'", + "'}'", "']'", "')'", "';'", "'/'", "'_'" }, std::vector{ "", "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", - "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", - "ILIKE", "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", - "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", "SELECT", - "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", - "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", - "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", - "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", - "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", + "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", + "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", + "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", + "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", + "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", + "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", + "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", @@ -113,7 +114,7 @@ void hogqlparserParserInitialize() { } ); static const int32_t serializedATNSegment[] = { - 4,1,160,1303,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6, + 4,1,162,1311,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6,7,6, 2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7,13,2,14, 7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2,20,7,20,2,21, 7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7,26,2,27,7,27,2,28, @@ -125,481 +126,486 @@ void hogqlparserParserInitialize() { 7,63,2,64,7,64,2,65,7,65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70, 7,70,2,71,7,71,2,72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77, 7,77,2,78,7,78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84, - 7,84,2,85,7,85,1,0,5,0,174,8,0,10,0,12,0,177,9,0,1,0,1,0,1,1,1,1,3,1, - 183,8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,192,8,3,1,4,1,4,1,4,5,4,197,8, - 4,10,4,12,4,200,9,4,1,4,3,4,203,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,3,5,217,8,5,1,6,1,6,3,6,221,8,6,1,6,3,6,224,8,6,1,7,1,7, - 3,7,228,8,7,1,7,3,7,231,8,7,1,8,1,8,1,8,1,8,1,8,3,8,238,8,8,1,8,1,8,3, - 8,242,8,8,1,8,1,8,1,9,1,9,1,9,5,9,249,8,9,10,9,12,9,252,9,9,1,9,1,9,3, - 9,256,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,265,8,10,1,11,1,11, - 1,11,1,11,1,11,1,11,3,11,273,8,11,1,12,1,12,1,12,1,12,1,12,3,12,280,8, - 12,1,12,1,12,3,12,284,8,12,1,12,1,12,1,12,1,12,3,12,290,8,12,1,12,1,12, - 1,12,3,12,295,8,12,1,13,1,13,1,13,1,13,1,13,1,13,3,13,303,8,13,1,13,1, - 13,1,13,1,13,1,13,3,13,310,8,13,1,14,1,14,1,14,1,14,3,14,316,8,14,1,14, - 1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,3,16,328,8,16,1,17,1,17, - 1,18,1,18,5,18,334,8,18,10,18,12,18,337,9,18,1,18,1,18,1,19,1,19,1,19, - 1,19,1,20,1,20,1,20,5,20,348,8,20,10,20,12,20,351,9,20,1,20,3,20,354, - 8,20,1,21,1,21,1,21,3,21,359,8,21,1,21,1,21,1,22,1,22,1,22,1,22,5,22, - 367,8,22,10,22,12,22,370,9,22,1,23,1,23,1,23,1,23,1,23,1,23,3,23,378, - 8,23,1,24,3,24,381,8,24,1,24,1,24,3,24,385,8,24,1,24,3,24,388,8,24,1, - 24,1,24,3,24,392,8,24,1,24,3,24,395,8,24,1,24,3,24,398,8,24,1,24,3,24, - 401,8,24,1,24,3,24,404,8,24,1,24,1,24,3,24,408,8,24,1,24,1,24,3,24,412, - 8,24,1,24,3,24,415,8,24,1,24,3,24,418,8,24,1,24,3,24,421,8,24,1,24,1, - 24,3,24,425,8,24,1,24,3,24,428,8,24,1,25,1,25,1,25,1,26,1,26,1,26,1,26, - 3,26,437,8,26,1,27,1,27,1,27,1,28,3,28,443,8,28,1,28,1,28,1,28,1,28,1, - 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,462, - 8,29,10,29,12,29,465,9,29,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32, - 1,32,1,32,1,32,1,32,1,32,3,32,481,8,32,1,33,1,33,1,33,1,34,1,34,1,34, - 1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,498,8,36,1,36,1,36, - 1,36,1,36,3,36,504,8,36,1,36,1,36,1,36,1,36,3,36,510,8,36,1,36,1,36,1, - 36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,521,8,36,3,36,523,8,36,1,37,1,37, - 1,37,1,38,1,38,1,38,1,39,1,39,1,39,3,39,534,8,39,1,39,3,39,537,8,39,1, - 39,1,39,1,39,1,39,3,39,543,8,39,1,39,1,39,1,39,1,39,1,39,1,39,3,39,551, - 8,39,1,39,1,39,1,39,1,39,5,39,557,8,39,10,39,12,39,560,9,39,1,40,3,40, - 563,8,40,1,40,1,40,1,40,3,40,568,8,40,1,40,3,40,571,8,40,1,40,3,40,574, - 8,40,1,40,1,40,3,40,578,8,40,1,40,1,40,3,40,582,8,40,1,40,3,40,585,8, - 40,3,40,587,8,40,1,40,3,40,590,8,40,1,40,1,40,3,40,594,8,40,1,40,1,40, - 3,40,598,8,40,1,40,3,40,601,8,40,3,40,603,8,40,3,40,605,8,40,1,41,1,41, - 1,41,3,41,610,8,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42, - 621,8,42,1,43,1,43,1,43,1,43,3,43,627,8,43,1,44,1,44,1,44,5,44,632,8, - 44,10,44,12,44,635,9,44,1,45,1,45,3,45,639,8,45,1,45,1,45,3,45,643,8, - 45,1,45,1,45,3,45,647,8,45,1,46,1,46,1,46,1,46,3,46,653,8,46,3,46,655, - 8,46,1,47,1,47,1,47,5,47,660,8,47,10,47,12,47,663,9,47,1,48,1,48,1,48, - 1,48,1,49,3,49,670,8,49,1,49,3,49,673,8,49,1,49,3,49,676,8,49,1,50,1, - 50,1,50,1,50,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1, - 53,1,53,3,53,695,8,53,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1,54,1, - 54,1,54,1,54,3,54,709,8,54,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1, - 56,1,56,1,56,1,56,5,56,723,8,56,10,56,12,56,726,9,56,1,56,3,56,729,8, - 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,738,8,56,10,56,12,56,741,9, - 56,1,56,3,56,744,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,753,8,56, - 10,56,12,56,756,9,56,1,56,3,56,759,8,56,1,56,1,56,1,56,1,56,1,56,3,56, - 766,8,56,1,56,1,56,3,56,770,8,56,1,57,1,57,1,57,5,57,775,8,57,10,57,12, - 57,778,9,57,1,57,3,57,781,8,57,1,58,1,58,1,58,3,58,786,8,58,1,58,1,58, - 1,58,1,58,1,58,4,58,793,8,58,11,58,12,58,794,1,58,1,58,3,58,799,8,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,823,8,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,840, - 8,58,1,58,1,58,1,58,1,58,3,58,846,8,58,1,58,3,58,849,8,58,1,58,3,58,852, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,862,8,58,1,58,1,58, - 1,58,1,58,3,58,868,8,58,1,58,3,58,871,8,58,1,58,3,58,874,8,58,1,58,1, - 58,1,58,1,58,1,58,1,58,3,58,882,8,58,1,58,3,58,885,8,58,1,58,1,58,3,58, - 889,8,58,1,58,3,58,892,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,58,1,58,3,58,906,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1, - 58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,923,8,58,1,58,1,58,1,58,3, - 58,928,8,58,1,58,1,58,1,58,3,58,933,8,58,1,58,1,58,1,58,1,58,3,58,939, - 8,58,1,58,1,58,1,58,1,58,1,58,3,58,946,8,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,3,58,958,8,58,1,58,1,58,3,58,962,8,58,1,58,3, - 58,965,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,974,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,988,8,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58, - 1004,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,3,58,1033,8,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,1041,8,58,5,58, - 1043,8,58,10,58,12,58,1046,9,58,1,59,1,59,1,59,1,59,5,59,1052,8,59,10, - 59,12,59,1055,9,59,1,59,3,59,1058,8,59,1,59,1,59,1,59,1,59,1,59,5,59, - 1065,8,59,10,59,12,59,1068,9,59,1,59,3,59,1071,8,59,1,59,1,59,3,59,1075, - 8,59,1,59,1,59,1,59,3,59,1080,8,59,1,60,1,60,1,60,5,60,1085,8,60,10,60, - 12,60,1088,9,60,1,60,1,60,1,60,1,60,1,60,1,60,5,60,1096,8,60,10,60,12, - 60,1099,9,60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1107,8,60,1,60,1,60,1, - 60,1,60,1,60,3,60,1114,8,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,3,61,1127,8,61,1,62,1,62,1,62,5,62,1132,8,62,10,62,12,62, - 1135,9,62,1,62,3,62,1138,8,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,3,63,1150,8,63,1,64,1,64,1,64,1,64,3,64,1156,8,64,1,64,3,64, - 1159,8,64,1,65,1,65,1,65,5,65,1164,8,65,10,65,12,65,1167,9,65,1,66,1, - 66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1178,8,66,1,66,1,66,1,66,1, - 66,3,66,1184,8,66,5,66,1186,8,66,10,66,12,66,1189,9,66,1,67,1,67,1,67, - 3,67,1194,8,67,1,67,1,67,1,68,1,68,1,68,3,68,1201,8,68,1,68,1,68,1,69, - 1,69,1,69,5,69,1208,8,69,10,69,12,69,1211,9,69,1,69,3,69,1214,8,69,1, - 70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,3,71,1224,8,71,3,71,1226,8,71,1, - 72,3,72,1229,8,72,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1237,8,72,1,73,1, - 73,1,73,3,73,1242,8,73,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,3,77,1252, - 8,77,1,78,1,78,1,78,3,78,1257,8,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80, - 1,80,1,81,1,81,3,81,1269,8,81,1,82,1,82,5,82,1273,8,82,10,82,12,82,1276, - 9,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,3,83,1285,8,83,1,84,1,84,5,84, - 1289,8,84,10,84,12,84,1292,9,84,1,84,1,84,1,85,1,85,1,85,1,85,1,85,3, - 85,1301,8,85,1,85,0,3,78,116,132,86,0,2,4,6,8,10,12,14,16,18,20,22,24, - 26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70, - 72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112, - 114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148, - 150,152,154,156,158,160,162,164,166,168,170,0,17,2,0,31,31,36,36,2,0, - 18,18,75,75,2,0,45,45,52,52,3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,81,81,2,0, - 52,52,74,74,2,0,1,1,4,4,2,0,7,7,22,23,2,0,30,30,50,50,2,0,72,72,77,77, - 3,0,10,10,51,51,91,91,2,0,42,42,54,54,1,0,108,109,2,0,119,119,140,140, - 7,0,21,21,39,39,56,57,71,71,79,79,98,98,104,104,17,0,1,13,15,20,22,28, - 30,30,32,35,37,38,40,43,45,52,54,55,59,59,61,70,72,78,80,84,86,93,95, - 97,99,100,102,103,4,0,20,20,30,30,40,40,49,49,1475,0,175,1,0,0,0,2,182, - 1,0,0,0,4,184,1,0,0,0,6,186,1,0,0,0,8,193,1,0,0,0,10,216,1,0,0,0,12,218, - 1,0,0,0,14,225,1,0,0,0,16,232,1,0,0,0,18,245,1,0,0,0,20,257,1,0,0,0,22, - 266,1,0,0,0,24,274,1,0,0,0,26,296,1,0,0,0,28,311,1,0,0,0,30,320,1,0,0, - 0,32,325,1,0,0,0,34,329,1,0,0,0,36,331,1,0,0,0,38,340,1,0,0,0,40,344, - 1,0,0,0,42,358,1,0,0,0,44,362,1,0,0,0,46,377,1,0,0,0,48,380,1,0,0,0,50, - 429,1,0,0,0,52,432,1,0,0,0,54,438,1,0,0,0,56,442,1,0,0,0,58,448,1,0,0, - 0,60,466,1,0,0,0,62,469,1,0,0,0,64,472,1,0,0,0,66,482,1,0,0,0,68,485, - 1,0,0,0,70,489,1,0,0,0,72,522,1,0,0,0,74,524,1,0,0,0,76,527,1,0,0,0,78, - 542,1,0,0,0,80,604,1,0,0,0,82,609,1,0,0,0,84,620,1,0,0,0,86,622,1,0,0, - 0,88,628,1,0,0,0,90,636,1,0,0,0,92,654,1,0,0,0,94,656,1,0,0,0,96,664, - 1,0,0,0,98,669,1,0,0,0,100,677,1,0,0,0,102,681,1,0,0,0,104,685,1,0,0, - 0,106,694,1,0,0,0,108,708,1,0,0,0,110,710,1,0,0,0,112,769,1,0,0,0,114, - 771,1,0,0,0,116,932,1,0,0,0,118,1074,1,0,0,0,120,1113,1,0,0,0,122,1126, - 1,0,0,0,124,1128,1,0,0,0,126,1149,1,0,0,0,128,1158,1,0,0,0,130,1160,1, - 0,0,0,132,1177,1,0,0,0,134,1190,1,0,0,0,136,1200,1,0,0,0,138,1204,1,0, - 0,0,140,1215,1,0,0,0,142,1225,1,0,0,0,144,1228,1,0,0,0,146,1241,1,0,0, - 0,148,1243,1,0,0,0,150,1245,1,0,0,0,152,1247,1,0,0,0,154,1251,1,0,0,0, - 156,1256,1,0,0,0,158,1258,1,0,0,0,160,1262,1,0,0,0,162,1268,1,0,0,0,164, - 1270,1,0,0,0,166,1284,1,0,0,0,168,1286,1,0,0,0,170,1300,1,0,0,0,172,174, - 3,2,1,0,173,172,1,0,0,0,174,177,1,0,0,0,175,173,1,0,0,0,175,176,1,0,0, - 0,176,178,1,0,0,0,177,175,1,0,0,0,178,179,5,0,0,1,179,1,1,0,0,0,180,183, - 3,6,3,0,181,183,3,10,5,0,182,180,1,0,0,0,182,181,1,0,0,0,183,3,1,0,0, - 0,184,185,3,116,58,0,185,5,1,0,0,0,186,187,5,53,0,0,187,191,3,156,78, - 0,188,189,5,116,0,0,189,190,5,123,0,0,190,192,3,4,2,0,191,188,1,0,0,0, - 191,192,1,0,0,0,192,7,1,0,0,0,193,198,3,156,78,0,194,195,5,117,0,0,195, - 197,3,156,78,0,196,194,1,0,0,0,197,200,1,0,0,0,198,196,1,0,0,0,198,199, - 1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,201,203,5,117,0,0,202,201,1,0, - 0,0,202,203,1,0,0,0,203,9,1,0,0,0,204,217,3,12,6,0,205,217,3,14,7,0,206, - 217,3,18,9,0,207,217,3,20,10,0,208,217,3,22,11,0,209,217,3,26,13,0,210, - 217,3,24,12,0,211,217,3,28,14,0,212,217,3,30,15,0,213,217,3,36,18,0,214, - 217,3,32,16,0,215,217,3,34,17,0,216,204,1,0,0,0,216,205,1,0,0,0,216,206, - 1,0,0,0,216,207,1,0,0,0,216,208,1,0,0,0,216,209,1,0,0,0,216,210,1,0,0, - 0,216,211,1,0,0,0,216,212,1,0,0,0,216,213,1,0,0,0,216,214,1,0,0,0,216, - 215,1,0,0,0,217,11,1,0,0,0,218,220,5,73,0,0,219,221,3,4,2,0,220,219,1, - 0,0,0,220,221,1,0,0,0,221,223,1,0,0,0,222,224,5,151,0,0,223,222,1,0,0, - 0,223,224,1,0,0,0,224,13,1,0,0,0,225,227,5,85,0,0,226,228,3,4,2,0,227, - 226,1,0,0,0,227,228,1,0,0,0,228,230,1,0,0,0,229,231,5,151,0,0,230,229, - 1,0,0,0,230,231,1,0,0,0,231,15,1,0,0,0,232,241,5,14,0,0,233,234,5,131, - 0,0,234,237,3,156,78,0,235,236,5,116,0,0,236,238,3,156,78,0,237,235,1, - 0,0,0,237,238,1,0,0,0,238,239,1,0,0,0,239,240,5,150,0,0,240,242,1,0,0, - 0,241,233,1,0,0,0,241,242,1,0,0,0,242,243,1,0,0,0,243,244,3,36,18,0,244, - 17,1,0,0,0,245,246,5,94,0,0,246,250,3,36,18,0,247,249,3,16,8,0,248,247, - 1,0,0,0,249,252,1,0,0,0,250,248,1,0,0,0,250,251,1,0,0,0,251,255,1,0,0, - 0,252,250,1,0,0,0,253,254,5,29,0,0,254,256,3,36,18,0,255,253,1,0,0,0, - 255,256,1,0,0,0,256,19,1,0,0,0,257,258,5,41,0,0,258,259,5,131,0,0,259, - 260,3,4,2,0,260,261,5,150,0,0,261,264,3,10,5,0,262,263,5,25,0,0,263,265, - 3,10,5,0,264,262,1,0,0,0,264,265,1,0,0,0,265,21,1,0,0,0,266,267,5,101, - 0,0,267,268,5,131,0,0,268,269,3,4,2,0,269,270,5,150,0,0,270,272,3,10, - 5,0,271,273,5,151,0,0,272,271,1,0,0,0,272,273,1,0,0,0,273,23,1,0,0,0, - 274,275,5,33,0,0,275,279,5,131,0,0,276,280,3,6,3,0,277,280,3,30,15,0, - 278,280,3,4,2,0,279,276,1,0,0,0,279,277,1,0,0,0,279,278,1,0,0,0,279,280, - 1,0,0,0,280,281,1,0,0,0,281,283,5,151,0,0,282,284,3,4,2,0,283,282,1,0, - 0,0,283,284,1,0,0,0,284,285,1,0,0,0,285,289,5,151,0,0,286,290,3,6,3,0, - 287,290,3,30,15,0,288,290,3,4,2,0,289,286,1,0,0,0,289,287,1,0,0,0,289, - 288,1,0,0,0,289,290,1,0,0,0,290,291,1,0,0,0,291,292,5,150,0,0,292,294, - 3,10,5,0,293,295,5,151,0,0,294,293,1,0,0,0,294,295,1,0,0,0,295,25,1,0, - 0,0,296,297,5,33,0,0,297,298,5,131,0,0,298,299,5,53,0,0,299,302,3,156, - 78,0,300,301,5,117,0,0,301,303,3,156,78,0,302,300,1,0,0,0,302,303,1,0, - 0,0,303,304,1,0,0,0,304,305,5,43,0,0,305,306,3,4,2,0,306,307,5,150,0, - 0,307,309,3,10,5,0,308,310,5,151,0,0,309,308,1,0,0,0,309,310,1,0,0,0, - 310,27,1,0,0,0,311,312,7,0,0,0,312,313,3,156,78,0,313,315,5,131,0,0,314, - 316,3,8,4,0,315,314,1,0,0,0,315,316,1,0,0,0,316,317,1,0,0,0,317,318,5, - 150,0,0,318,319,3,36,18,0,319,29,1,0,0,0,320,321,3,4,2,0,321,322,5,116, - 0,0,322,323,5,123,0,0,323,324,3,4,2,0,324,31,1,0,0,0,325,327,3,4,2,0, - 326,328,5,151,0,0,327,326,1,0,0,0,327,328,1,0,0,0,328,33,1,0,0,0,329, - 330,5,151,0,0,330,35,1,0,0,0,331,335,5,129,0,0,332,334,3,2,1,0,333,332, - 1,0,0,0,334,337,1,0,0,0,335,333,1,0,0,0,335,336,1,0,0,0,336,338,1,0,0, - 0,337,335,1,0,0,0,338,339,5,148,0,0,339,37,1,0,0,0,340,341,3,4,2,0,341, - 342,5,116,0,0,342,343,3,4,2,0,343,39,1,0,0,0,344,349,3,38,19,0,345,346, - 5,117,0,0,346,348,3,38,19,0,347,345,1,0,0,0,348,351,1,0,0,0,349,347,1, - 0,0,0,349,350,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,352,354,5,117,0, - 0,353,352,1,0,0,0,353,354,1,0,0,0,354,41,1,0,0,0,355,359,3,44,22,0,356, - 359,3,48,24,0,357,359,3,120,60,0,358,355,1,0,0,0,358,356,1,0,0,0,358, - 357,1,0,0,0,359,360,1,0,0,0,360,361,5,0,0,1,361,43,1,0,0,0,362,368,3, - 46,23,0,363,364,5,96,0,0,364,365,5,1,0,0,365,367,3,46,23,0,366,363,1, - 0,0,0,367,370,1,0,0,0,368,366,1,0,0,0,368,369,1,0,0,0,369,45,1,0,0,0, - 370,368,1,0,0,0,371,378,3,48,24,0,372,373,5,131,0,0,373,374,3,44,22,0, - 374,375,5,150,0,0,375,378,1,0,0,0,376,378,3,160,80,0,377,371,1,0,0,0, - 377,372,1,0,0,0,377,376,1,0,0,0,378,47,1,0,0,0,379,381,3,50,25,0,380, - 379,1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,384,5,80,0,0,383,385, - 5,24,0,0,384,383,1,0,0,0,384,385,1,0,0,0,385,387,1,0,0,0,386,388,3,52, - 26,0,387,386,1,0,0,0,387,388,1,0,0,0,388,389,1,0,0,0,389,391,3,114,57, - 0,390,392,3,54,27,0,391,390,1,0,0,0,391,392,1,0,0,0,392,394,1,0,0,0,393, - 395,3,56,28,0,394,393,1,0,0,0,394,395,1,0,0,0,395,397,1,0,0,0,396,398, - 3,60,30,0,397,396,1,0,0,0,397,398,1,0,0,0,398,400,1,0,0,0,399,401,3,62, - 31,0,400,399,1,0,0,0,400,401,1,0,0,0,401,403,1,0,0,0,402,404,3,64,32, - 0,403,402,1,0,0,0,403,404,1,0,0,0,404,407,1,0,0,0,405,406,5,103,0,0,406, - 408,7,1,0,0,407,405,1,0,0,0,407,408,1,0,0,0,408,411,1,0,0,0,409,410,5, - 103,0,0,410,412,5,90,0,0,411,409,1,0,0,0,411,412,1,0,0,0,412,414,1,0, - 0,0,413,415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,417,1,0,0,0, - 416,418,3,58,29,0,417,416,1,0,0,0,417,418,1,0,0,0,418,420,1,0,0,0,419, - 421,3,68,34,0,420,419,1,0,0,0,420,421,1,0,0,0,421,424,1,0,0,0,422,425, - 3,72,36,0,423,425,3,74,37,0,424,422,1,0,0,0,424,423,1,0,0,0,424,425,1, - 0,0,0,425,427,1,0,0,0,426,428,3,76,38,0,427,426,1,0,0,0,427,428,1,0,0, - 0,428,49,1,0,0,0,429,430,5,103,0,0,430,431,3,124,62,0,431,51,1,0,0,0, - 432,433,5,89,0,0,433,436,5,109,0,0,434,435,5,103,0,0,435,437,5,86,0,0, - 436,434,1,0,0,0,436,437,1,0,0,0,437,53,1,0,0,0,438,439,5,34,0,0,439,440, - 3,78,39,0,440,55,1,0,0,0,441,443,7,2,0,0,442,441,1,0,0,0,442,443,1,0, - 0,0,443,444,1,0,0,0,444,445,5,5,0,0,445,446,5,48,0,0,446,447,3,114,57, - 0,447,57,1,0,0,0,448,449,5,102,0,0,449,450,3,156,78,0,450,451,5,6,0,0, - 451,452,5,131,0,0,452,453,3,98,49,0,453,463,5,150,0,0,454,455,5,117,0, - 0,455,456,3,156,78,0,456,457,5,6,0,0,457,458,5,131,0,0,458,459,3,98,49, - 0,459,460,5,150,0,0,460,462,1,0,0,0,461,454,1,0,0,0,462,465,1,0,0,0,463, - 461,1,0,0,0,463,464,1,0,0,0,464,59,1,0,0,0,465,463,1,0,0,0,466,467,5, - 70,0,0,467,468,3,116,58,0,468,61,1,0,0,0,469,470,5,100,0,0,470,471,3, - 116,58,0,471,63,1,0,0,0,472,473,5,37,0,0,473,480,5,11,0,0,474,475,7,1, - 0,0,475,476,5,131,0,0,476,477,3,114,57,0,477,478,5,150,0,0,478,481,1, - 0,0,0,479,481,3,114,57,0,480,474,1,0,0,0,480,479,1,0,0,0,481,65,1,0,0, - 0,482,483,5,38,0,0,483,484,3,116,58,0,484,67,1,0,0,0,485,486,5,65,0,0, - 486,487,5,11,0,0,487,488,3,88,44,0,488,69,1,0,0,0,489,490,5,65,0,0,490, - 491,5,11,0,0,491,492,3,114,57,0,492,71,1,0,0,0,493,494,5,55,0,0,494,497, - 3,116,58,0,495,496,5,117,0,0,496,498,3,116,58,0,497,495,1,0,0,0,497,498, - 1,0,0,0,498,503,1,0,0,0,499,500,5,103,0,0,500,504,5,86,0,0,501,502,5, - 11,0,0,502,504,3,114,57,0,503,499,1,0,0,0,503,501,1,0,0,0,503,504,1,0, - 0,0,504,523,1,0,0,0,505,506,5,55,0,0,506,509,3,116,58,0,507,508,5,103, - 0,0,508,510,5,86,0,0,509,507,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0, - 511,512,5,62,0,0,512,513,3,116,58,0,513,523,1,0,0,0,514,515,5,55,0,0, - 515,516,3,116,58,0,516,517,5,62,0,0,517,520,3,116,58,0,518,519,5,11,0, - 0,519,521,3,114,57,0,520,518,1,0,0,0,520,521,1,0,0,0,521,523,1,0,0,0, - 522,493,1,0,0,0,522,505,1,0,0,0,522,514,1,0,0,0,523,73,1,0,0,0,524,525, - 5,62,0,0,525,526,3,116,58,0,526,75,1,0,0,0,527,528,5,82,0,0,528,529,3, - 94,47,0,529,77,1,0,0,0,530,531,6,39,-1,0,531,533,3,132,66,0,532,534,5, - 28,0,0,533,532,1,0,0,0,533,534,1,0,0,0,534,536,1,0,0,0,535,537,3,86,43, - 0,536,535,1,0,0,0,536,537,1,0,0,0,537,543,1,0,0,0,538,539,5,131,0,0,539, - 540,3,78,39,0,540,541,5,150,0,0,541,543,1,0,0,0,542,530,1,0,0,0,542,538, - 1,0,0,0,543,558,1,0,0,0,544,545,10,3,0,0,545,546,3,82,41,0,546,547,3, - 78,39,4,547,557,1,0,0,0,548,550,10,4,0,0,549,551,3,80,40,0,550,549,1, - 0,0,0,550,551,1,0,0,0,551,552,1,0,0,0,552,553,5,48,0,0,553,554,3,78,39, - 0,554,555,3,84,42,0,555,557,1,0,0,0,556,544,1,0,0,0,556,548,1,0,0,0,557, - 560,1,0,0,0,558,556,1,0,0,0,558,559,1,0,0,0,559,79,1,0,0,0,560,558,1, - 0,0,0,561,563,7,3,0,0,562,561,1,0,0,0,562,563,1,0,0,0,563,564,1,0,0,0, - 564,571,5,45,0,0,565,567,5,45,0,0,566,568,7,3,0,0,567,566,1,0,0,0,567, - 568,1,0,0,0,568,571,1,0,0,0,569,571,7,3,0,0,570,562,1,0,0,0,570,565,1, - 0,0,0,570,569,1,0,0,0,571,605,1,0,0,0,572,574,7,4,0,0,573,572,1,0,0,0, - 573,574,1,0,0,0,574,575,1,0,0,0,575,577,7,5,0,0,576,578,5,66,0,0,577, - 576,1,0,0,0,577,578,1,0,0,0,578,587,1,0,0,0,579,581,7,5,0,0,580,582,5, - 66,0,0,581,580,1,0,0,0,581,582,1,0,0,0,582,584,1,0,0,0,583,585,7,4,0, - 0,584,583,1,0,0,0,584,585,1,0,0,0,585,587,1,0,0,0,586,573,1,0,0,0,586, - 579,1,0,0,0,587,605,1,0,0,0,588,590,7,6,0,0,589,588,1,0,0,0,589,590,1, - 0,0,0,590,591,1,0,0,0,591,593,5,35,0,0,592,594,5,66,0,0,593,592,1,0,0, - 0,593,594,1,0,0,0,594,603,1,0,0,0,595,597,5,35,0,0,596,598,5,66,0,0,597, - 596,1,0,0,0,597,598,1,0,0,0,598,600,1,0,0,0,599,601,7,6,0,0,600,599,1, - 0,0,0,600,601,1,0,0,0,601,603,1,0,0,0,602,589,1,0,0,0,602,595,1,0,0,0, - 603,605,1,0,0,0,604,570,1,0,0,0,604,586,1,0,0,0,604,602,1,0,0,0,605,81, - 1,0,0,0,606,607,5,17,0,0,607,610,5,48,0,0,608,610,5,117,0,0,609,606,1, - 0,0,0,609,608,1,0,0,0,610,83,1,0,0,0,611,612,5,63,0,0,612,621,3,114,57, - 0,613,614,5,97,0,0,614,615,5,131,0,0,615,616,3,114,57,0,616,617,5,150, - 0,0,617,621,1,0,0,0,618,619,5,97,0,0,619,621,3,114,57,0,620,611,1,0,0, - 0,620,613,1,0,0,0,620,618,1,0,0,0,621,85,1,0,0,0,622,623,5,78,0,0,623, - 626,3,92,46,0,624,625,5,62,0,0,625,627,3,92,46,0,626,624,1,0,0,0,626, - 627,1,0,0,0,627,87,1,0,0,0,628,633,3,90,45,0,629,630,5,117,0,0,630,632, - 3,90,45,0,631,629,1,0,0,0,632,635,1,0,0,0,633,631,1,0,0,0,633,634,1,0, - 0,0,634,89,1,0,0,0,635,633,1,0,0,0,636,638,3,116,58,0,637,639,7,7,0,0, - 638,637,1,0,0,0,638,639,1,0,0,0,639,642,1,0,0,0,640,641,5,61,0,0,641, - 643,7,8,0,0,642,640,1,0,0,0,642,643,1,0,0,0,643,646,1,0,0,0,644,645,5, - 16,0,0,645,647,5,111,0,0,646,644,1,0,0,0,646,647,1,0,0,0,647,91,1,0,0, - 0,648,655,3,160,80,0,649,652,3,144,72,0,650,651,5,152,0,0,651,653,3,144, - 72,0,652,650,1,0,0,0,652,653,1,0,0,0,653,655,1,0,0,0,654,648,1,0,0,0, - 654,649,1,0,0,0,655,93,1,0,0,0,656,661,3,96,48,0,657,658,5,117,0,0,658, - 660,3,96,48,0,659,657,1,0,0,0,660,663,1,0,0,0,661,659,1,0,0,0,661,662, - 1,0,0,0,662,95,1,0,0,0,663,661,1,0,0,0,664,665,3,156,78,0,665,666,5,123, - 0,0,666,667,3,146,73,0,667,97,1,0,0,0,668,670,3,100,50,0,669,668,1,0, - 0,0,669,670,1,0,0,0,670,672,1,0,0,0,671,673,3,102,51,0,672,671,1,0,0, - 0,672,673,1,0,0,0,673,675,1,0,0,0,674,676,3,104,52,0,675,674,1,0,0,0, - 675,676,1,0,0,0,676,99,1,0,0,0,677,678,5,68,0,0,678,679,5,11,0,0,679, - 680,3,114,57,0,680,101,1,0,0,0,681,682,5,65,0,0,682,683,5,11,0,0,683, - 684,3,88,44,0,684,103,1,0,0,0,685,686,7,9,0,0,686,687,3,106,53,0,687, - 105,1,0,0,0,688,695,3,108,54,0,689,690,5,9,0,0,690,691,3,108,54,0,691, - 692,5,2,0,0,692,693,3,108,54,0,693,695,1,0,0,0,694,688,1,0,0,0,694,689, - 1,0,0,0,695,107,1,0,0,0,696,697,5,19,0,0,697,709,5,76,0,0,698,699,5,95, - 0,0,699,709,5,69,0,0,700,701,5,95,0,0,701,709,5,32,0,0,702,703,3,144, - 72,0,703,704,5,69,0,0,704,709,1,0,0,0,705,706,3,144,72,0,706,707,5,32, - 0,0,707,709,1,0,0,0,708,696,1,0,0,0,708,698,1,0,0,0,708,700,1,0,0,0,708, - 702,1,0,0,0,708,705,1,0,0,0,709,109,1,0,0,0,710,711,3,116,58,0,711,712, - 5,0,0,1,712,111,1,0,0,0,713,770,3,156,78,0,714,715,3,156,78,0,715,716, - 5,131,0,0,716,717,3,156,78,0,717,724,3,112,56,0,718,719,5,117,0,0,719, - 720,3,156,78,0,720,721,3,112,56,0,721,723,1,0,0,0,722,718,1,0,0,0,723, - 726,1,0,0,0,724,722,1,0,0,0,724,725,1,0,0,0,725,728,1,0,0,0,726,724,1, - 0,0,0,727,729,5,117,0,0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0, - 0,730,731,5,150,0,0,731,770,1,0,0,0,732,733,3,156,78,0,733,734,5,131, - 0,0,734,739,3,158,79,0,735,736,5,117,0,0,736,738,3,158,79,0,737,735,1, - 0,0,0,738,741,1,0,0,0,739,737,1,0,0,0,739,740,1,0,0,0,740,743,1,0,0,0, - 741,739,1,0,0,0,742,744,5,117,0,0,743,742,1,0,0,0,743,744,1,0,0,0,744, - 745,1,0,0,0,745,746,5,150,0,0,746,770,1,0,0,0,747,748,3,156,78,0,748, - 749,5,131,0,0,749,754,3,112,56,0,750,751,5,117,0,0,751,753,3,112,56,0, - 752,750,1,0,0,0,753,756,1,0,0,0,754,752,1,0,0,0,754,755,1,0,0,0,755,758, - 1,0,0,0,756,754,1,0,0,0,757,759,5,117,0,0,758,757,1,0,0,0,758,759,1,0, - 0,0,759,760,1,0,0,0,760,761,5,150,0,0,761,770,1,0,0,0,762,763,3,156,78, - 0,763,765,5,131,0,0,764,766,3,114,57,0,765,764,1,0,0,0,765,766,1,0,0, - 0,766,767,1,0,0,0,767,768,5,150,0,0,768,770,1,0,0,0,769,713,1,0,0,0,769, - 714,1,0,0,0,769,732,1,0,0,0,769,747,1,0,0,0,769,762,1,0,0,0,770,113,1, - 0,0,0,771,776,3,116,58,0,772,773,5,117,0,0,773,775,3,116,58,0,774,772, - 1,0,0,0,775,778,1,0,0,0,776,774,1,0,0,0,776,777,1,0,0,0,777,780,1,0,0, - 0,778,776,1,0,0,0,779,781,5,117,0,0,780,779,1,0,0,0,780,781,1,0,0,0,781, - 115,1,0,0,0,782,783,6,58,-1,0,783,785,5,12,0,0,784,786,3,116,58,0,785, - 784,1,0,0,0,785,786,1,0,0,0,786,792,1,0,0,0,787,788,5,99,0,0,788,789, - 3,116,58,0,789,790,5,84,0,0,790,791,3,116,58,0,791,793,1,0,0,0,792,787, - 1,0,0,0,793,794,1,0,0,0,794,792,1,0,0,0,794,795,1,0,0,0,795,798,1,0,0, - 0,796,797,5,25,0,0,797,799,3,116,58,0,798,796,1,0,0,0,798,799,1,0,0,0, - 799,800,1,0,0,0,800,801,5,26,0,0,801,933,1,0,0,0,802,803,5,13,0,0,803, - 804,5,131,0,0,804,805,3,116,58,0,805,806,5,6,0,0,806,807,3,112,56,0,807, - 808,5,150,0,0,808,933,1,0,0,0,809,810,5,20,0,0,810,933,5,111,0,0,811, - 812,5,46,0,0,812,813,3,116,58,0,813,814,3,148,74,0,814,933,1,0,0,0,815, - 816,5,83,0,0,816,817,5,131,0,0,817,818,3,116,58,0,818,819,5,34,0,0,819, - 822,3,116,58,0,820,821,5,33,0,0,821,823,3,116,58,0,822,820,1,0,0,0,822, - 823,1,0,0,0,823,824,1,0,0,0,824,825,5,150,0,0,825,933,1,0,0,0,826,827, - 5,87,0,0,827,933,5,111,0,0,828,829,5,92,0,0,829,830,5,131,0,0,830,831, - 7,10,0,0,831,832,3,162,81,0,832,833,5,34,0,0,833,834,3,116,58,0,834,835, - 5,150,0,0,835,933,1,0,0,0,836,837,3,156,78,0,837,839,5,131,0,0,838,840, - 3,114,57,0,839,838,1,0,0,0,839,840,1,0,0,0,840,841,1,0,0,0,841,842,5, - 150,0,0,842,851,1,0,0,0,843,845,5,131,0,0,844,846,5,24,0,0,845,844,1, - 0,0,0,845,846,1,0,0,0,846,848,1,0,0,0,847,849,3,114,57,0,848,847,1,0, - 0,0,848,849,1,0,0,0,849,850,1,0,0,0,850,852,5,150,0,0,851,843,1,0,0,0, - 851,852,1,0,0,0,852,853,1,0,0,0,853,854,5,67,0,0,854,855,5,131,0,0,855, - 856,3,98,49,0,856,857,5,150,0,0,857,933,1,0,0,0,858,859,3,156,78,0,859, - 861,5,131,0,0,860,862,3,114,57,0,861,860,1,0,0,0,861,862,1,0,0,0,862, - 863,1,0,0,0,863,864,5,150,0,0,864,873,1,0,0,0,865,867,5,131,0,0,866,868, - 5,24,0,0,867,866,1,0,0,0,867,868,1,0,0,0,868,870,1,0,0,0,869,871,3,114, - 57,0,870,869,1,0,0,0,870,871,1,0,0,0,871,872,1,0,0,0,872,874,5,150,0, - 0,873,865,1,0,0,0,873,874,1,0,0,0,874,875,1,0,0,0,875,876,5,67,0,0,876, - 877,3,156,78,0,877,933,1,0,0,0,878,884,3,156,78,0,879,881,5,131,0,0,880, - 882,3,114,57,0,881,880,1,0,0,0,881,882,1,0,0,0,882,883,1,0,0,0,883,885, - 5,150,0,0,884,879,1,0,0,0,884,885,1,0,0,0,885,886,1,0,0,0,886,888,5,131, - 0,0,887,889,5,24,0,0,888,887,1,0,0,0,888,889,1,0,0,0,889,891,1,0,0,0, - 890,892,3,114,57,0,891,890,1,0,0,0,891,892,1,0,0,0,892,893,1,0,0,0,893, - 894,5,150,0,0,894,933,1,0,0,0,895,933,3,120,60,0,896,933,3,164,82,0,897, - 933,3,146,73,0,898,899,5,119,0,0,899,933,3,116,58,20,900,901,5,59,0,0, - 901,933,3,116,58,14,902,903,3,136,68,0,903,904,5,121,0,0,904,906,1,0, - 0,0,905,902,1,0,0,0,905,906,1,0,0,0,906,907,1,0,0,0,907,933,5,113,0,0, - 908,909,5,131,0,0,909,910,3,44,22,0,910,911,5,150,0,0,911,933,1,0,0,0, - 912,913,5,131,0,0,913,914,3,116,58,0,914,915,5,150,0,0,915,933,1,0,0, - 0,916,917,5,131,0,0,917,918,3,114,57,0,918,919,5,150,0,0,919,933,1,0, - 0,0,920,922,5,130,0,0,921,923,3,114,57,0,922,921,1,0,0,0,922,923,1,0, - 0,0,923,924,1,0,0,0,924,933,5,149,0,0,925,927,5,129,0,0,926,928,3,40, - 20,0,927,926,1,0,0,0,927,928,1,0,0,0,928,929,1,0,0,0,929,933,5,148,0, - 0,930,933,3,118,59,0,931,933,3,128,64,0,932,782,1,0,0,0,932,802,1,0,0, - 0,932,809,1,0,0,0,932,811,1,0,0,0,932,815,1,0,0,0,932,826,1,0,0,0,932, - 828,1,0,0,0,932,836,1,0,0,0,932,858,1,0,0,0,932,878,1,0,0,0,932,895,1, - 0,0,0,932,896,1,0,0,0,932,897,1,0,0,0,932,898,1,0,0,0,932,900,1,0,0,0, - 932,905,1,0,0,0,932,908,1,0,0,0,932,912,1,0,0,0,932,916,1,0,0,0,932,920, - 1,0,0,0,932,925,1,0,0,0,932,930,1,0,0,0,932,931,1,0,0,0,933,1044,1,0, - 0,0,934,938,10,19,0,0,935,939,5,113,0,0,936,939,5,152,0,0,937,939,5,139, - 0,0,938,935,1,0,0,0,938,936,1,0,0,0,938,937,1,0,0,0,939,940,1,0,0,0,940, - 1043,3,116,58,20,941,945,10,18,0,0,942,946,5,140,0,0,943,946,5,119,0, - 0,944,946,5,118,0,0,945,942,1,0,0,0,945,943,1,0,0,0,945,944,1,0,0,0,946, - 947,1,0,0,0,947,1043,3,116,58,19,948,973,10,17,0,0,949,974,5,122,0,0, - 950,974,5,123,0,0,951,974,5,134,0,0,952,974,5,132,0,0,953,974,5,133,0, - 0,954,974,5,124,0,0,955,974,5,125,0,0,956,958,5,59,0,0,957,956,1,0,0, - 0,957,958,1,0,0,0,958,959,1,0,0,0,959,961,5,43,0,0,960,962,5,15,0,0,961, - 960,1,0,0,0,961,962,1,0,0,0,962,974,1,0,0,0,963,965,5,59,0,0,964,963, - 1,0,0,0,964,965,1,0,0,0,965,966,1,0,0,0,966,974,7,11,0,0,967,974,5,146, - 0,0,968,974,5,147,0,0,969,974,5,136,0,0,970,974,5,127,0,0,971,974,5,128, - 0,0,972,974,5,135,0,0,973,949,1,0,0,0,973,950,1,0,0,0,973,951,1,0,0,0, - 973,952,1,0,0,0,973,953,1,0,0,0,973,954,1,0,0,0,973,955,1,0,0,0,973,957, - 1,0,0,0,973,964,1,0,0,0,973,967,1,0,0,0,973,968,1,0,0,0,973,969,1,0,0, - 0,973,970,1,0,0,0,973,971,1,0,0,0,973,972,1,0,0,0,974,975,1,0,0,0,975, - 1043,3,116,58,18,976,977,10,15,0,0,977,978,5,138,0,0,978,1043,3,116,58, - 16,979,980,10,13,0,0,980,981,5,2,0,0,981,1043,3,116,58,14,982,983,10, - 12,0,0,983,984,5,64,0,0,984,1043,3,116,58,13,985,987,10,11,0,0,986,988, - 5,59,0,0,987,986,1,0,0,0,987,988,1,0,0,0,988,989,1,0,0,0,989,990,5,9, - 0,0,990,991,3,116,58,0,991,992,5,2,0,0,992,993,3,116,58,12,993,1043,1, - 0,0,0,994,995,10,10,0,0,995,996,5,141,0,0,996,997,3,116,58,0,997,998, - 5,116,0,0,998,999,3,116,58,10,999,1043,1,0,0,0,1000,1001,10,30,0,0,1001, - 1003,5,131,0,0,1002,1004,3,114,57,0,1003,1002,1,0,0,0,1003,1004,1,0,0, - 0,1004,1005,1,0,0,0,1005,1043,5,150,0,0,1006,1007,10,26,0,0,1007,1008, - 5,130,0,0,1008,1009,3,116,58,0,1009,1010,5,149,0,0,1010,1043,1,0,0,0, - 1011,1012,10,25,0,0,1012,1013,5,121,0,0,1013,1043,5,109,0,0,1014,1015, - 10,24,0,0,1015,1016,5,121,0,0,1016,1043,3,156,78,0,1017,1018,10,23,0, - 0,1018,1019,5,137,0,0,1019,1020,5,130,0,0,1020,1021,3,116,58,0,1021,1022, - 5,149,0,0,1022,1043,1,0,0,0,1023,1024,10,22,0,0,1024,1025,5,137,0,0,1025, - 1043,5,109,0,0,1026,1027,10,21,0,0,1027,1028,5,137,0,0,1028,1043,3,156, - 78,0,1029,1030,10,16,0,0,1030,1032,5,47,0,0,1031,1033,5,59,0,0,1032,1031, - 1,0,0,0,1032,1033,1,0,0,0,1033,1034,1,0,0,0,1034,1043,5,60,0,0,1035,1040, - 10,9,0,0,1036,1037,5,6,0,0,1037,1041,3,156,78,0,1038,1039,5,6,0,0,1039, - 1041,5,111,0,0,1040,1036,1,0,0,0,1040,1038,1,0,0,0,1041,1043,1,0,0,0, - 1042,934,1,0,0,0,1042,941,1,0,0,0,1042,948,1,0,0,0,1042,976,1,0,0,0,1042, - 979,1,0,0,0,1042,982,1,0,0,0,1042,985,1,0,0,0,1042,994,1,0,0,0,1042,1000, - 1,0,0,0,1042,1006,1,0,0,0,1042,1011,1,0,0,0,1042,1014,1,0,0,0,1042,1017, - 1,0,0,0,1042,1023,1,0,0,0,1042,1026,1,0,0,0,1042,1029,1,0,0,0,1042,1035, - 1,0,0,0,1043,1046,1,0,0,0,1044,1042,1,0,0,0,1044,1045,1,0,0,0,1045,117, - 1,0,0,0,1046,1044,1,0,0,0,1047,1048,5,131,0,0,1048,1053,3,156,78,0,1049, - 1050,5,117,0,0,1050,1052,3,156,78,0,1051,1049,1,0,0,0,1052,1055,1,0,0, - 0,1053,1051,1,0,0,0,1053,1054,1,0,0,0,1054,1057,1,0,0,0,1055,1053,1,0, - 0,0,1056,1058,5,117,0,0,1057,1056,1,0,0,0,1057,1058,1,0,0,0,1058,1059, - 1,0,0,0,1059,1060,5,150,0,0,1060,1075,1,0,0,0,1061,1066,3,156,78,0,1062, - 1063,5,117,0,0,1063,1065,3,156,78,0,1064,1062,1,0,0,0,1065,1068,1,0,0, - 0,1066,1064,1,0,0,0,1066,1067,1,0,0,0,1067,1070,1,0,0,0,1068,1066,1,0, - 0,0,1069,1071,5,117,0,0,1070,1069,1,0,0,0,1070,1071,1,0,0,0,1071,1075, - 1,0,0,0,1072,1073,5,131,0,0,1073,1075,5,150,0,0,1074,1047,1,0,0,0,1074, - 1061,1,0,0,0,1074,1072,1,0,0,0,1075,1076,1,0,0,0,1076,1079,5,112,0,0, - 1077,1080,3,116,58,0,1078,1080,3,36,18,0,1079,1077,1,0,0,0,1079,1078, - 1,0,0,0,1080,119,1,0,0,0,1081,1082,5,133,0,0,1082,1086,3,156,78,0,1083, - 1085,3,122,61,0,1084,1083,1,0,0,0,1085,1088,1,0,0,0,1086,1084,1,0,0,0, - 1086,1087,1,0,0,0,1087,1089,1,0,0,0,1088,1086,1,0,0,0,1089,1090,5,152, - 0,0,1090,1091,5,125,0,0,1091,1114,1,0,0,0,1092,1093,5,133,0,0,1093,1097, - 3,156,78,0,1094,1096,3,122,61,0,1095,1094,1,0,0,0,1096,1099,1,0,0,0,1097, - 1095,1,0,0,0,1097,1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097,1,0,0,0,1100, - 1106,5,125,0,0,1101,1107,3,120,60,0,1102,1103,5,129,0,0,1103,1104,3,116, - 58,0,1104,1105,5,148,0,0,1105,1107,1,0,0,0,1106,1101,1,0,0,0,1106,1102, - 1,0,0,0,1106,1107,1,0,0,0,1107,1108,1,0,0,0,1108,1109,5,133,0,0,1109, - 1110,5,152,0,0,1110,1111,3,156,78,0,1111,1112,5,125,0,0,1112,1114,1,0, - 0,0,1113,1081,1,0,0,0,1113,1092,1,0,0,0,1114,121,1,0,0,0,1115,1116,3, - 156,78,0,1116,1117,5,123,0,0,1117,1118,3,162,81,0,1118,1127,1,0,0,0,1119, - 1120,3,156,78,0,1120,1121,5,123,0,0,1121,1122,5,129,0,0,1122,1123,3,116, - 58,0,1123,1124,5,148,0,0,1124,1127,1,0,0,0,1125,1127,3,156,78,0,1126, - 1115,1,0,0,0,1126,1119,1,0,0,0,1126,1125,1,0,0,0,1127,123,1,0,0,0,1128, - 1133,3,126,63,0,1129,1130,5,117,0,0,1130,1132,3,126,63,0,1131,1129,1, - 0,0,0,1132,1135,1,0,0,0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1137, - 1,0,0,0,1135,1133,1,0,0,0,1136,1138,5,117,0,0,1137,1136,1,0,0,0,1137, - 1138,1,0,0,0,1138,125,1,0,0,0,1139,1140,3,156,78,0,1140,1141,5,6,0,0, - 1141,1142,5,131,0,0,1142,1143,3,44,22,0,1143,1144,5,150,0,0,1144,1150, - 1,0,0,0,1145,1146,3,116,58,0,1146,1147,5,6,0,0,1147,1148,3,156,78,0,1148, - 1150,1,0,0,0,1149,1139,1,0,0,0,1149,1145,1,0,0,0,1150,127,1,0,0,0,1151, - 1159,3,160,80,0,1152,1153,3,136,68,0,1153,1154,5,121,0,0,1154,1156,1, - 0,0,0,1155,1152,1,0,0,0,1155,1156,1,0,0,0,1156,1157,1,0,0,0,1157,1159, - 3,130,65,0,1158,1151,1,0,0,0,1158,1155,1,0,0,0,1159,129,1,0,0,0,1160, - 1165,3,156,78,0,1161,1162,5,121,0,0,1162,1164,3,156,78,0,1163,1161,1, - 0,0,0,1164,1167,1,0,0,0,1165,1163,1,0,0,0,1165,1166,1,0,0,0,1166,131, - 1,0,0,0,1167,1165,1,0,0,0,1168,1169,6,66,-1,0,1169,1178,3,136,68,0,1170, - 1178,3,134,67,0,1171,1172,5,131,0,0,1172,1173,3,44,22,0,1173,1174,5,150, - 0,0,1174,1178,1,0,0,0,1175,1178,3,120,60,0,1176,1178,3,160,80,0,1177, - 1168,1,0,0,0,1177,1170,1,0,0,0,1177,1171,1,0,0,0,1177,1175,1,0,0,0,1177, - 1176,1,0,0,0,1178,1187,1,0,0,0,1179,1183,10,3,0,0,1180,1184,3,154,77, - 0,1181,1182,5,6,0,0,1182,1184,3,156,78,0,1183,1180,1,0,0,0,1183,1181, - 1,0,0,0,1184,1186,1,0,0,0,1185,1179,1,0,0,0,1186,1189,1,0,0,0,1187,1185, - 1,0,0,0,1187,1188,1,0,0,0,1188,133,1,0,0,0,1189,1187,1,0,0,0,1190,1191, - 3,156,78,0,1191,1193,5,131,0,0,1192,1194,3,138,69,0,1193,1192,1,0,0,0, - 1193,1194,1,0,0,0,1194,1195,1,0,0,0,1195,1196,5,150,0,0,1196,135,1,0, - 0,0,1197,1198,3,140,70,0,1198,1199,5,121,0,0,1199,1201,1,0,0,0,1200,1197, - 1,0,0,0,1200,1201,1,0,0,0,1201,1202,1,0,0,0,1202,1203,3,156,78,0,1203, - 137,1,0,0,0,1204,1209,3,116,58,0,1205,1206,5,117,0,0,1206,1208,3,116, - 58,0,1207,1205,1,0,0,0,1208,1211,1,0,0,0,1209,1207,1,0,0,0,1209,1210, - 1,0,0,0,1210,1213,1,0,0,0,1211,1209,1,0,0,0,1212,1214,5,117,0,0,1213, - 1212,1,0,0,0,1213,1214,1,0,0,0,1214,139,1,0,0,0,1215,1216,3,156,78,0, - 1216,141,1,0,0,0,1217,1226,5,107,0,0,1218,1219,5,121,0,0,1219,1226,7, - 12,0,0,1220,1221,5,109,0,0,1221,1223,5,121,0,0,1222,1224,7,12,0,0,1223, - 1222,1,0,0,0,1223,1224,1,0,0,0,1224,1226,1,0,0,0,1225,1217,1,0,0,0,1225, - 1218,1,0,0,0,1225,1220,1,0,0,0,1226,143,1,0,0,0,1227,1229,7,13,0,0,1228, - 1227,1,0,0,0,1228,1229,1,0,0,0,1229,1236,1,0,0,0,1230,1237,3,142,71,0, - 1231,1237,5,108,0,0,1232,1237,5,109,0,0,1233,1237,5,110,0,0,1234,1237, - 5,44,0,0,1235,1237,5,58,0,0,1236,1230,1,0,0,0,1236,1231,1,0,0,0,1236, - 1232,1,0,0,0,1236,1233,1,0,0,0,1236,1234,1,0,0,0,1236,1235,1,0,0,0,1237, - 145,1,0,0,0,1238,1242,3,144,72,0,1239,1242,5,111,0,0,1240,1242,5,60,0, - 0,1241,1238,1,0,0,0,1241,1239,1,0,0,0,1241,1240,1,0,0,0,1242,147,1,0, - 0,0,1243,1244,7,14,0,0,1244,149,1,0,0,0,1245,1246,7,15,0,0,1246,151,1, - 0,0,0,1247,1248,7,16,0,0,1248,153,1,0,0,0,1249,1252,5,106,0,0,1250,1252, - 3,152,76,0,1251,1249,1,0,0,0,1251,1250,1,0,0,0,1252,155,1,0,0,0,1253, - 1257,5,106,0,0,1254,1257,3,148,74,0,1255,1257,3,150,75,0,1256,1253,1, - 0,0,0,1256,1254,1,0,0,0,1256,1255,1,0,0,0,1257,157,1,0,0,0,1258,1259, - 3,162,81,0,1259,1260,5,123,0,0,1260,1261,3,144,72,0,1261,159,1,0,0,0, - 1262,1263,5,129,0,0,1263,1264,3,116,58,0,1264,1265,5,148,0,0,1265,161, - 1,0,0,0,1266,1269,5,111,0,0,1267,1269,3,164,82,0,1268,1266,1,0,0,0,1268, - 1267,1,0,0,0,1269,163,1,0,0,0,1270,1274,5,143,0,0,1271,1273,3,166,83, - 0,1272,1271,1,0,0,0,1273,1276,1,0,0,0,1274,1272,1,0,0,0,1274,1275,1,0, - 0,0,1275,1277,1,0,0,0,1276,1274,1,0,0,0,1277,1278,5,145,0,0,1278,165, - 1,0,0,0,1279,1280,5,158,0,0,1280,1281,3,116,58,0,1281,1282,5,148,0,0, - 1282,1285,1,0,0,0,1283,1285,5,157,0,0,1284,1279,1,0,0,0,1284,1283,1,0, - 0,0,1285,167,1,0,0,0,1286,1290,5,144,0,0,1287,1289,3,170,85,0,1288,1287, - 1,0,0,0,1289,1292,1,0,0,0,1290,1288,1,0,0,0,1290,1291,1,0,0,0,1291,1293, - 1,0,0,0,1292,1290,1,0,0,0,1293,1294,5,0,0,1,1294,169,1,0,0,0,1295,1296, - 5,160,0,0,1296,1297,3,116,58,0,1297,1298,5,148,0,0,1298,1301,1,0,0,0, - 1299,1301,5,159,0,0,1300,1295,1,0,0,0,1300,1299,1,0,0,0,1301,171,1,0, - 0,0,167,175,182,191,198,202,216,220,223,227,230,237,241,250,255,264,272, - 279,283,289,294,302,309,315,327,335,349,353,358,368,377,380,384,387,391, - 394,397,400,403,407,411,414,417,420,424,427,436,442,463,480,497,503,509, - 520,522,533,536,542,550,556,558,562,567,570,573,577,581,584,586,589,593, - 597,600,602,604,609,620,626,633,638,642,646,652,654,661,669,672,675,694, - 708,724,728,739,743,754,758,765,769,776,780,785,794,798,822,839,845,848, - 851,861,867,870,873,881,884,888,891,905,922,927,932,938,945,957,961,964, - 973,987,1003,1032,1040,1042,1044,1053,1057,1066,1070,1074,1079,1086,1097, - 1106,1113,1126,1133,1137,1149,1155,1158,1165,1177,1183,1187,1193,1200, - 1209,1213,1223,1225,1228,1236,1241,1251,1256,1268,1274,1284,1290,1300 + 7,84,2,85,7,85,2,86,7,86,1,0,5,0,176,8,0,10,0,12,0,179,9,0,1,0,1,0,1, + 1,1,1,3,1,185,8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,194,8,3,1,4,1,4,1,4, + 5,4,199,8,4,10,4,12,4,202,9,4,1,4,3,4,205,8,4,1,5,1,5,1,5,1,5,1,5,1,5, + 1,5,1,5,1,5,1,5,1,5,1,5,3,5,219,8,5,1,6,1,6,3,6,223,8,6,1,6,3,6,226,8, + 6,1,7,1,7,3,7,230,8,7,1,7,3,7,233,8,7,1,8,1,8,1,8,1,8,1,8,3,8,240,8,8, + 1,8,1,8,3,8,244,8,8,1,8,1,8,1,9,1,9,1,9,5,9,251,8,9,10,9,12,9,254,9,9, + 1,9,1,9,3,9,258,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1,10,3,10,267,8,10, + 1,11,1,11,1,11,1,11,1,11,1,11,3,11,275,8,11,1,12,1,12,1,12,1,12,1,12, + 3,12,282,8,12,1,12,1,12,3,12,286,8,12,1,12,1,12,1,12,1,12,3,12,292,8, + 12,1,12,1,12,1,12,3,12,297,8,12,1,13,1,13,1,13,1,13,1,13,1,13,3,13,305, + 8,13,1,13,1,13,1,13,1,13,1,13,3,13,312,8,13,1,14,1,14,1,14,1,14,3,14, + 318,8,14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,3,16,330,8, + 16,1,17,1,17,1,18,1,18,5,18,336,8,18,10,18,12,18,339,9,18,1,18,1,18,1, + 19,1,19,1,19,1,19,1,20,1,20,1,20,5,20,350,8,20,10,20,12,20,353,9,20,1, + 20,3,20,356,8,20,1,21,1,21,1,21,3,21,361,8,21,1,21,1,21,1,22,1,22,1,22, + 1,22,1,22,1,22,3,22,371,8,22,1,23,1,23,1,23,1,23,3,23,377,8,23,1,23,1, + 23,1,24,1,24,5,24,383,8,24,10,24,12,24,386,9,24,1,25,3,25,389,8,25,1, + 25,1,25,3,25,393,8,25,1,25,3,25,396,8,25,1,25,1,25,3,25,400,8,25,1,25, + 3,25,403,8,25,1,25,3,25,406,8,25,1,25,3,25,409,8,25,1,25,3,25,412,8,25, + 1,25,1,25,3,25,416,8,25,1,25,1,25,3,25,420,8,25,1,25,3,25,423,8,25,1, + 25,3,25,426,8,25,1,25,3,25,429,8,25,1,25,1,25,3,25,433,8,25,1,25,3,25, + 436,8,25,1,26,1,26,1,26,1,27,1,27,1,27,1,27,3,27,445,8,27,1,28,1,28,1, + 28,1,29,3,29,451,8,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1, + 30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,5,30,470,8,30,10,30,12,30,473,9, + 30,1,31,1,31,1,31,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1, + 33,3,33,489,8,33,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1, + 36,1,37,1,37,1,37,1,37,3,37,506,8,37,1,37,1,37,1,37,1,37,3,37,512,8,37, + 1,37,1,37,1,37,1,37,3,37,518,8,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, + 1,37,1,37,3,37,529,8,37,3,37,531,8,37,1,38,1,38,1,38,1,39,1,39,1,39,1, + 40,1,40,1,40,3,40,542,8,40,1,40,3,40,545,8,40,1,40,1,40,1,40,1,40,3,40, + 551,8,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,559,8,40,1,40,1,40,1,40,1, + 40,5,40,565,8,40,10,40,12,40,568,9,40,1,41,3,41,571,8,41,1,41,1,41,1, + 41,3,41,576,8,41,1,41,3,41,579,8,41,1,41,3,41,582,8,41,1,41,1,41,3,41, + 586,8,41,1,41,1,41,3,41,590,8,41,1,41,3,41,593,8,41,3,41,595,8,41,1,41, + 3,41,598,8,41,1,41,1,41,3,41,602,8,41,1,41,1,41,3,41,606,8,41,1,41,3, + 41,609,8,41,3,41,611,8,41,3,41,613,8,41,1,42,1,42,1,42,3,42,618,8,42, + 1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,3,43,629,8,43,1,44,1,44, + 1,44,1,44,3,44,635,8,44,1,45,1,45,1,45,5,45,640,8,45,10,45,12,45,643, + 9,45,1,46,1,46,3,46,647,8,46,1,46,1,46,3,46,651,8,46,1,46,1,46,3,46,655, + 8,46,1,47,1,47,1,47,1,47,3,47,661,8,47,3,47,663,8,47,1,48,1,48,1,48,5, + 48,668,8,48,10,48,12,48,671,9,48,1,49,1,49,1,49,1,49,1,50,3,50,678,8, + 50,1,50,3,50,681,8,50,1,50,3,50,684,8,50,1,51,1,51,1,51,1,51,1,52,1,52, + 1,52,1,52,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,3,54,703,8,54, + 1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3,55,717, + 8,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,5,57, + 731,8,57,10,57,12,57,734,9,57,1,57,3,57,737,8,57,1,57,1,57,1,57,1,57, + 1,57,1,57,1,57,5,57,746,8,57,10,57,12,57,749,9,57,1,57,3,57,752,8,57, + 1,57,1,57,1,57,1,57,1,57,1,57,1,57,5,57,761,8,57,10,57,12,57,764,9,57, + 1,57,3,57,767,8,57,1,57,1,57,1,57,1,57,1,57,3,57,774,8,57,1,57,1,57,3, + 57,778,8,57,1,58,1,58,1,58,5,58,783,8,58,10,58,12,58,786,9,58,1,58,3, + 58,789,8,58,1,59,1,59,1,59,3,59,794,8,59,1,59,1,59,1,59,1,59,1,59,4,59, + 801,8,59,11,59,12,59,802,1,59,1,59,3,59,807,8,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,831,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,848,8,59,1,59,1,59,1,59, + 1,59,3,59,854,8,59,1,59,3,59,857,8,59,1,59,3,59,860,8,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,870,8,59,1,59,1,59,1,59,1,59,3,59,876, + 8,59,1,59,3,59,879,8,59,1,59,3,59,882,8,59,1,59,1,59,1,59,1,59,1,59,1, + 59,3,59,890,8,59,1,59,3,59,893,8,59,1,59,1,59,3,59,897,8,59,1,59,3,59, + 900,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 3,59,914,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,931,8,59,1,59,1,59,1,59,3,59,936,8,59,1,59,1, + 59,1,59,3,59,941,8,59,1,59,1,59,1,59,1,59,3,59,947,8,59,1,59,1,59,1,59, + 1,59,1,59,3,59,954,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,3,59,966,8,59,1,59,1,59,3,59,970,8,59,1,59,3,59,973,8,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,982,8,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,996,8,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1012,8,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1041,8, + 59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1049,8,59,5,59,1051,8,59,10,59, + 12,59,1054,9,59,1,60,1,60,1,60,1,60,5,60,1060,8,60,10,60,12,60,1063,9, + 60,1,60,3,60,1066,8,60,1,60,1,60,1,60,1,60,1,60,5,60,1073,8,60,10,60, + 12,60,1076,9,60,1,60,3,60,1079,8,60,1,60,1,60,3,60,1083,8,60,1,60,1,60, + 1,60,3,60,1088,8,60,1,61,1,61,1,61,5,61,1093,8,61,10,61,12,61,1096,9, + 61,1,61,1,61,1,61,1,61,1,61,1,61,5,61,1104,8,61,10,61,12,61,1107,9,61, + 1,61,1,61,1,61,1,61,1,61,1,61,3,61,1115,8,61,1,61,1,61,1,61,1,61,1,61, + 3,61,1122,8,61,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62,1,62, + 3,62,1135,8,62,1,63,1,63,1,63,5,63,1140,8,63,10,63,12,63,1143,9,63,1, + 63,3,63,1146,8,63,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3, + 64,1158,8,64,1,65,1,65,1,65,1,65,3,65,1164,8,65,1,65,3,65,1167,8,65,1, + 66,1,66,1,66,5,66,1172,8,66,10,66,12,66,1175,9,66,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,1,67,1,67,3,67,1186,8,67,1,67,1,67,1,67,1,67,3,67,1192, + 8,67,5,67,1194,8,67,10,67,12,67,1197,9,67,1,68,1,68,1,68,3,68,1202,8, + 68,1,68,1,68,1,69,1,69,1,69,3,69,1209,8,69,1,69,1,69,1,70,1,70,1,70,5, + 70,1216,8,70,10,70,12,70,1219,9,70,1,70,3,70,1222,8,70,1,71,1,71,1,72, + 1,72,1,72,1,72,1,72,1,72,3,72,1232,8,72,3,72,1234,8,72,1,73,3,73,1237, + 8,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1245,8,73,1,74,1,74,1,74,3,74, + 1250,8,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78,1,78,3,78,1260,8,78,1,79, + 1,79,1,79,3,79,1265,8,79,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,82, + 1,82,3,82,1277,8,82,1,83,1,83,5,83,1281,8,83,10,83,12,83,1284,9,83,1, + 83,1,83,1,84,1,84,1,84,1,84,1,84,3,84,1293,8,84,1,85,1,85,5,85,1297,8, + 85,10,85,12,85,1300,9,85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,3,86,1309, + 8,86,1,86,0,3,80,118,134,87,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30, + 32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76, + 78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116, + 118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152, + 154,156,158,160,162,164,166,168,170,172,0,17,2,0,32,32,37,37,2,0,18,18, + 77,77,2,0,46,46,54,54,3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,83,83,2,0,54,54, + 76,76,2,0,1,1,4,4,2,0,7,7,22,23,2,0,31,31,52,52,2,0,74,74,79,79,3,0,10, + 10,53,53,93,93,2,0,43,43,56,56,1,0,110,111,2,0,121,121,142,142,7,0,21, + 21,40,40,58,59,73,73,81,81,100,100,106,106,19,0,1,13,15,20,22,26,28,29, + 31,31,33,36,38,39,41,44,46,46,48,54,56,57,61,61,63,72,74,80,82,86,88, + 95,97,99,101,102,104,105,4,0,20,20,31,31,41,41,51,51,1484,0,177,1,0,0, + 0,2,184,1,0,0,0,4,186,1,0,0,0,6,188,1,0,0,0,8,195,1,0,0,0,10,218,1,0, + 0,0,12,220,1,0,0,0,14,227,1,0,0,0,16,234,1,0,0,0,18,247,1,0,0,0,20,259, + 1,0,0,0,22,268,1,0,0,0,24,276,1,0,0,0,26,298,1,0,0,0,28,313,1,0,0,0,30, + 322,1,0,0,0,32,327,1,0,0,0,34,331,1,0,0,0,36,333,1,0,0,0,38,342,1,0,0, + 0,40,346,1,0,0,0,42,360,1,0,0,0,44,370,1,0,0,0,46,376,1,0,0,0,48,380, + 1,0,0,0,50,388,1,0,0,0,52,437,1,0,0,0,54,440,1,0,0,0,56,446,1,0,0,0,58, + 450,1,0,0,0,60,456,1,0,0,0,62,474,1,0,0,0,64,477,1,0,0,0,66,480,1,0,0, + 0,68,490,1,0,0,0,70,493,1,0,0,0,72,497,1,0,0,0,74,530,1,0,0,0,76,532, + 1,0,0,0,78,535,1,0,0,0,80,550,1,0,0,0,82,612,1,0,0,0,84,617,1,0,0,0,86, + 628,1,0,0,0,88,630,1,0,0,0,90,636,1,0,0,0,92,644,1,0,0,0,94,662,1,0,0, + 0,96,664,1,0,0,0,98,672,1,0,0,0,100,677,1,0,0,0,102,685,1,0,0,0,104,689, + 1,0,0,0,106,693,1,0,0,0,108,702,1,0,0,0,110,716,1,0,0,0,112,718,1,0,0, + 0,114,777,1,0,0,0,116,779,1,0,0,0,118,940,1,0,0,0,120,1082,1,0,0,0,122, + 1121,1,0,0,0,124,1134,1,0,0,0,126,1136,1,0,0,0,128,1157,1,0,0,0,130,1166, + 1,0,0,0,132,1168,1,0,0,0,134,1185,1,0,0,0,136,1198,1,0,0,0,138,1208,1, + 0,0,0,140,1212,1,0,0,0,142,1223,1,0,0,0,144,1233,1,0,0,0,146,1236,1,0, + 0,0,148,1249,1,0,0,0,150,1251,1,0,0,0,152,1253,1,0,0,0,154,1255,1,0,0, + 0,156,1259,1,0,0,0,158,1264,1,0,0,0,160,1266,1,0,0,0,162,1270,1,0,0,0, + 164,1276,1,0,0,0,166,1278,1,0,0,0,168,1292,1,0,0,0,170,1294,1,0,0,0,172, + 1308,1,0,0,0,174,176,3,2,1,0,175,174,1,0,0,0,176,179,1,0,0,0,177,175, + 1,0,0,0,177,178,1,0,0,0,178,180,1,0,0,0,179,177,1,0,0,0,180,181,5,0,0, + 1,181,1,1,0,0,0,182,185,3,6,3,0,183,185,3,10,5,0,184,182,1,0,0,0,184, + 183,1,0,0,0,185,3,1,0,0,0,186,187,3,118,59,0,187,5,1,0,0,0,188,189,5, + 55,0,0,189,193,3,158,79,0,190,191,5,118,0,0,191,192,5,125,0,0,192,194, + 3,4,2,0,193,190,1,0,0,0,193,194,1,0,0,0,194,7,1,0,0,0,195,200,3,158,79, + 0,196,197,5,119,0,0,197,199,3,158,79,0,198,196,1,0,0,0,199,202,1,0,0, + 0,200,198,1,0,0,0,200,201,1,0,0,0,201,204,1,0,0,0,202,200,1,0,0,0,203, + 205,5,119,0,0,204,203,1,0,0,0,204,205,1,0,0,0,205,9,1,0,0,0,206,219,3, + 12,6,0,207,219,3,14,7,0,208,219,3,18,9,0,209,219,3,20,10,0,210,219,3, + 22,11,0,211,219,3,26,13,0,212,219,3,24,12,0,213,219,3,28,14,0,214,219, + 3,30,15,0,215,219,3,36,18,0,216,219,3,32,16,0,217,219,3,34,17,0,218,206, + 1,0,0,0,218,207,1,0,0,0,218,208,1,0,0,0,218,209,1,0,0,0,218,210,1,0,0, + 0,218,211,1,0,0,0,218,212,1,0,0,0,218,213,1,0,0,0,218,214,1,0,0,0,218, + 215,1,0,0,0,218,216,1,0,0,0,218,217,1,0,0,0,219,11,1,0,0,0,220,222,5, + 75,0,0,221,223,3,4,2,0,222,221,1,0,0,0,222,223,1,0,0,0,223,225,1,0,0, + 0,224,226,5,153,0,0,225,224,1,0,0,0,225,226,1,0,0,0,226,13,1,0,0,0,227, + 229,5,87,0,0,228,230,3,4,2,0,229,228,1,0,0,0,229,230,1,0,0,0,230,232, + 1,0,0,0,231,233,5,153,0,0,232,231,1,0,0,0,232,233,1,0,0,0,233,15,1,0, + 0,0,234,243,5,14,0,0,235,236,5,133,0,0,236,239,3,158,79,0,237,238,5,118, + 0,0,238,240,3,158,79,0,239,237,1,0,0,0,239,240,1,0,0,0,240,241,1,0,0, + 0,241,242,5,152,0,0,242,244,1,0,0,0,243,235,1,0,0,0,243,244,1,0,0,0,244, + 245,1,0,0,0,245,246,3,36,18,0,246,17,1,0,0,0,247,248,5,96,0,0,248,252, + 3,36,18,0,249,251,3,16,8,0,250,249,1,0,0,0,251,254,1,0,0,0,252,250,1, + 0,0,0,252,253,1,0,0,0,253,257,1,0,0,0,254,252,1,0,0,0,255,256,5,30,0, + 0,256,258,3,36,18,0,257,255,1,0,0,0,257,258,1,0,0,0,258,19,1,0,0,0,259, + 260,5,42,0,0,260,261,5,133,0,0,261,262,3,4,2,0,262,263,5,152,0,0,263, + 266,3,10,5,0,264,265,5,25,0,0,265,267,3,10,5,0,266,264,1,0,0,0,266,267, + 1,0,0,0,267,21,1,0,0,0,268,269,5,103,0,0,269,270,5,133,0,0,270,271,3, + 4,2,0,271,272,5,152,0,0,272,274,3,10,5,0,273,275,5,153,0,0,274,273,1, + 0,0,0,274,275,1,0,0,0,275,23,1,0,0,0,276,277,5,34,0,0,277,281,5,133,0, + 0,278,282,3,6,3,0,279,282,3,30,15,0,280,282,3,4,2,0,281,278,1,0,0,0,281, + 279,1,0,0,0,281,280,1,0,0,0,281,282,1,0,0,0,282,283,1,0,0,0,283,285,5, + 153,0,0,284,286,3,4,2,0,285,284,1,0,0,0,285,286,1,0,0,0,286,287,1,0,0, + 0,287,291,5,153,0,0,288,292,3,6,3,0,289,292,3,30,15,0,290,292,3,4,2,0, + 291,288,1,0,0,0,291,289,1,0,0,0,291,290,1,0,0,0,291,292,1,0,0,0,292,293, + 1,0,0,0,293,294,5,152,0,0,294,296,3,10,5,0,295,297,5,153,0,0,296,295, + 1,0,0,0,296,297,1,0,0,0,297,25,1,0,0,0,298,299,5,34,0,0,299,300,5,133, + 0,0,300,301,5,55,0,0,301,304,3,158,79,0,302,303,5,119,0,0,303,305,3,158, + 79,0,304,302,1,0,0,0,304,305,1,0,0,0,305,306,1,0,0,0,306,307,5,44,0,0, + 307,308,3,4,2,0,308,309,5,152,0,0,309,311,3,10,5,0,310,312,5,153,0,0, + 311,310,1,0,0,0,311,312,1,0,0,0,312,27,1,0,0,0,313,314,7,0,0,0,314,315, + 3,158,79,0,315,317,5,133,0,0,316,318,3,8,4,0,317,316,1,0,0,0,317,318, + 1,0,0,0,318,319,1,0,0,0,319,320,5,152,0,0,320,321,3,36,18,0,321,29,1, + 0,0,0,322,323,3,4,2,0,323,324,5,118,0,0,324,325,5,125,0,0,325,326,3,4, + 2,0,326,31,1,0,0,0,327,329,3,4,2,0,328,330,5,153,0,0,329,328,1,0,0,0, + 329,330,1,0,0,0,330,33,1,0,0,0,331,332,5,153,0,0,332,35,1,0,0,0,333,337, + 5,131,0,0,334,336,3,2,1,0,335,334,1,0,0,0,336,339,1,0,0,0,337,335,1,0, + 0,0,337,338,1,0,0,0,338,340,1,0,0,0,339,337,1,0,0,0,340,341,5,150,0,0, + 341,37,1,0,0,0,342,343,3,4,2,0,343,344,5,118,0,0,344,345,3,4,2,0,345, + 39,1,0,0,0,346,351,3,38,19,0,347,348,5,119,0,0,348,350,3,38,19,0,349, + 347,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,351,352,1,0,0,0,352,355,1, + 0,0,0,353,351,1,0,0,0,354,356,5,119,0,0,355,354,1,0,0,0,355,356,1,0,0, + 0,356,41,1,0,0,0,357,361,3,48,24,0,358,361,3,50,25,0,359,361,3,122,61, + 0,360,357,1,0,0,0,360,358,1,0,0,0,360,359,1,0,0,0,361,362,1,0,0,0,362, + 363,5,0,0,1,363,43,1,0,0,0,364,371,3,50,25,0,365,366,5,133,0,0,366,367, + 3,48,24,0,367,368,5,152,0,0,368,371,1,0,0,0,369,371,3,162,81,0,370,364, + 1,0,0,0,370,365,1,0,0,0,370,369,1,0,0,0,371,45,1,0,0,0,372,377,5,27,0, + 0,373,374,5,98,0,0,374,377,5,1,0,0,375,377,5,47,0,0,376,372,1,0,0,0,376, + 373,1,0,0,0,376,375,1,0,0,0,377,378,1,0,0,0,378,379,3,44,22,0,379,47, + 1,0,0,0,380,384,3,44,22,0,381,383,3,46,23,0,382,381,1,0,0,0,383,386,1, + 0,0,0,384,382,1,0,0,0,384,385,1,0,0,0,385,49,1,0,0,0,386,384,1,0,0,0, + 387,389,3,52,26,0,388,387,1,0,0,0,388,389,1,0,0,0,389,390,1,0,0,0,390, + 392,5,82,0,0,391,393,5,24,0,0,392,391,1,0,0,0,392,393,1,0,0,0,393,395, + 1,0,0,0,394,396,3,54,27,0,395,394,1,0,0,0,395,396,1,0,0,0,396,397,1,0, + 0,0,397,399,3,116,58,0,398,400,3,56,28,0,399,398,1,0,0,0,399,400,1,0, + 0,0,400,402,1,0,0,0,401,403,3,58,29,0,402,401,1,0,0,0,402,403,1,0,0,0, + 403,405,1,0,0,0,404,406,3,62,31,0,405,404,1,0,0,0,405,406,1,0,0,0,406, + 408,1,0,0,0,407,409,3,64,32,0,408,407,1,0,0,0,408,409,1,0,0,0,409,411, + 1,0,0,0,410,412,3,66,33,0,411,410,1,0,0,0,411,412,1,0,0,0,412,415,1,0, + 0,0,413,414,5,105,0,0,414,416,7,1,0,0,415,413,1,0,0,0,415,416,1,0,0,0, + 416,419,1,0,0,0,417,418,5,105,0,0,418,420,5,92,0,0,419,417,1,0,0,0,419, + 420,1,0,0,0,420,422,1,0,0,0,421,423,3,68,34,0,422,421,1,0,0,0,422,423, + 1,0,0,0,423,425,1,0,0,0,424,426,3,60,30,0,425,424,1,0,0,0,425,426,1,0, + 0,0,426,428,1,0,0,0,427,429,3,70,35,0,428,427,1,0,0,0,428,429,1,0,0,0, + 429,432,1,0,0,0,430,433,3,74,37,0,431,433,3,76,38,0,432,430,1,0,0,0,432, + 431,1,0,0,0,432,433,1,0,0,0,433,435,1,0,0,0,434,436,3,78,39,0,435,434, + 1,0,0,0,435,436,1,0,0,0,436,51,1,0,0,0,437,438,5,105,0,0,438,439,3,126, + 63,0,439,53,1,0,0,0,440,441,5,91,0,0,441,444,5,111,0,0,442,443,5,105, + 0,0,443,445,5,88,0,0,444,442,1,0,0,0,444,445,1,0,0,0,445,55,1,0,0,0,446, + 447,5,35,0,0,447,448,3,80,40,0,448,57,1,0,0,0,449,451,7,2,0,0,450,449, + 1,0,0,0,450,451,1,0,0,0,451,452,1,0,0,0,452,453,5,5,0,0,453,454,5,50, + 0,0,454,455,3,116,58,0,455,59,1,0,0,0,456,457,5,104,0,0,457,458,3,158, + 79,0,458,459,5,6,0,0,459,460,5,133,0,0,460,461,3,100,50,0,461,471,5,152, + 0,0,462,463,5,119,0,0,463,464,3,158,79,0,464,465,5,6,0,0,465,466,5,133, + 0,0,466,467,3,100,50,0,467,468,5,152,0,0,468,470,1,0,0,0,469,462,1,0, + 0,0,470,473,1,0,0,0,471,469,1,0,0,0,471,472,1,0,0,0,472,61,1,0,0,0,473, + 471,1,0,0,0,474,475,5,72,0,0,475,476,3,118,59,0,476,63,1,0,0,0,477,478, + 5,102,0,0,478,479,3,118,59,0,479,65,1,0,0,0,480,481,5,38,0,0,481,488, + 5,11,0,0,482,483,7,1,0,0,483,484,5,133,0,0,484,485,3,116,58,0,485,486, + 5,152,0,0,486,489,1,0,0,0,487,489,3,116,58,0,488,482,1,0,0,0,488,487, + 1,0,0,0,489,67,1,0,0,0,490,491,5,39,0,0,491,492,3,118,59,0,492,69,1,0, + 0,0,493,494,5,67,0,0,494,495,5,11,0,0,495,496,3,90,45,0,496,71,1,0,0, + 0,497,498,5,67,0,0,498,499,5,11,0,0,499,500,3,116,58,0,500,73,1,0,0,0, + 501,502,5,57,0,0,502,505,3,118,59,0,503,504,5,119,0,0,504,506,3,118,59, + 0,505,503,1,0,0,0,505,506,1,0,0,0,506,511,1,0,0,0,507,508,5,105,0,0,508, + 512,5,88,0,0,509,510,5,11,0,0,510,512,3,116,58,0,511,507,1,0,0,0,511, + 509,1,0,0,0,511,512,1,0,0,0,512,531,1,0,0,0,513,514,5,57,0,0,514,517, + 3,118,59,0,515,516,5,105,0,0,516,518,5,88,0,0,517,515,1,0,0,0,517,518, + 1,0,0,0,518,519,1,0,0,0,519,520,5,64,0,0,520,521,3,118,59,0,521,531,1, + 0,0,0,522,523,5,57,0,0,523,524,3,118,59,0,524,525,5,64,0,0,525,528,3, + 118,59,0,526,527,5,11,0,0,527,529,3,116,58,0,528,526,1,0,0,0,528,529, + 1,0,0,0,529,531,1,0,0,0,530,501,1,0,0,0,530,513,1,0,0,0,530,522,1,0,0, + 0,531,75,1,0,0,0,532,533,5,64,0,0,533,534,3,118,59,0,534,77,1,0,0,0,535, + 536,5,84,0,0,536,537,3,96,48,0,537,79,1,0,0,0,538,539,6,40,-1,0,539,541, + 3,134,67,0,540,542,5,29,0,0,541,540,1,0,0,0,541,542,1,0,0,0,542,544,1, + 0,0,0,543,545,3,88,44,0,544,543,1,0,0,0,544,545,1,0,0,0,545,551,1,0,0, + 0,546,547,5,133,0,0,547,548,3,80,40,0,548,549,5,152,0,0,549,551,1,0,0, + 0,550,538,1,0,0,0,550,546,1,0,0,0,551,566,1,0,0,0,552,553,10,3,0,0,553, + 554,3,84,42,0,554,555,3,80,40,4,555,565,1,0,0,0,556,558,10,4,0,0,557, + 559,3,82,41,0,558,557,1,0,0,0,558,559,1,0,0,0,559,560,1,0,0,0,560,561, + 5,50,0,0,561,562,3,80,40,0,562,563,3,86,43,0,563,565,1,0,0,0,564,552, + 1,0,0,0,564,556,1,0,0,0,565,568,1,0,0,0,566,564,1,0,0,0,566,567,1,0,0, + 0,567,81,1,0,0,0,568,566,1,0,0,0,569,571,7,3,0,0,570,569,1,0,0,0,570, + 571,1,0,0,0,571,572,1,0,0,0,572,579,5,46,0,0,573,575,5,46,0,0,574,576, + 7,3,0,0,575,574,1,0,0,0,575,576,1,0,0,0,576,579,1,0,0,0,577,579,7,3,0, + 0,578,570,1,0,0,0,578,573,1,0,0,0,578,577,1,0,0,0,579,613,1,0,0,0,580, + 582,7,4,0,0,581,580,1,0,0,0,581,582,1,0,0,0,582,583,1,0,0,0,583,585,7, + 5,0,0,584,586,5,68,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,595,1,0,0, + 0,587,589,7,5,0,0,588,590,5,68,0,0,589,588,1,0,0,0,589,590,1,0,0,0,590, + 592,1,0,0,0,591,593,7,4,0,0,592,591,1,0,0,0,592,593,1,0,0,0,593,595,1, + 0,0,0,594,581,1,0,0,0,594,587,1,0,0,0,595,613,1,0,0,0,596,598,7,6,0,0, + 597,596,1,0,0,0,597,598,1,0,0,0,598,599,1,0,0,0,599,601,5,36,0,0,600, + 602,5,68,0,0,601,600,1,0,0,0,601,602,1,0,0,0,602,611,1,0,0,0,603,605, + 5,36,0,0,604,606,5,68,0,0,605,604,1,0,0,0,605,606,1,0,0,0,606,608,1,0, + 0,0,607,609,7,6,0,0,608,607,1,0,0,0,608,609,1,0,0,0,609,611,1,0,0,0,610, + 597,1,0,0,0,610,603,1,0,0,0,611,613,1,0,0,0,612,578,1,0,0,0,612,594,1, + 0,0,0,612,610,1,0,0,0,613,83,1,0,0,0,614,615,5,17,0,0,615,618,5,50,0, + 0,616,618,5,119,0,0,617,614,1,0,0,0,617,616,1,0,0,0,618,85,1,0,0,0,619, + 620,5,65,0,0,620,629,3,116,58,0,621,622,5,99,0,0,622,623,5,133,0,0,623, + 624,3,116,58,0,624,625,5,152,0,0,625,629,1,0,0,0,626,627,5,99,0,0,627, + 629,3,116,58,0,628,619,1,0,0,0,628,621,1,0,0,0,628,626,1,0,0,0,629,87, + 1,0,0,0,630,631,5,80,0,0,631,634,3,94,47,0,632,633,5,64,0,0,633,635,3, + 94,47,0,634,632,1,0,0,0,634,635,1,0,0,0,635,89,1,0,0,0,636,641,3,92,46, + 0,637,638,5,119,0,0,638,640,3,92,46,0,639,637,1,0,0,0,640,643,1,0,0,0, + 641,639,1,0,0,0,641,642,1,0,0,0,642,91,1,0,0,0,643,641,1,0,0,0,644,646, + 3,118,59,0,645,647,7,7,0,0,646,645,1,0,0,0,646,647,1,0,0,0,647,650,1, + 0,0,0,648,649,5,63,0,0,649,651,7,8,0,0,650,648,1,0,0,0,650,651,1,0,0, + 0,651,654,1,0,0,0,652,653,5,16,0,0,653,655,5,113,0,0,654,652,1,0,0,0, + 654,655,1,0,0,0,655,93,1,0,0,0,656,663,3,162,81,0,657,660,3,146,73,0, + 658,659,5,154,0,0,659,661,3,146,73,0,660,658,1,0,0,0,660,661,1,0,0,0, + 661,663,1,0,0,0,662,656,1,0,0,0,662,657,1,0,0,0,663,95,1,0,0,0,664,669, + 3,98,49,0,665,666,5,119,0,0,666,668,3,98,49,0,667,665,1,0,0,0,668,671, + 1,0,0,0,669,667,1,0,0,0,669,670,1,0,0,0,670,97,1,0,0,0,671,669,1,0,0, + 0,672,673,3,158,79,0,673,674,5,125,0,0,674,675,3,148,74,0,675,99,1,0, + 0,0,676,678,3,102,51,0,677,676,1,0,0,0,677,678,1,0,0,0,678,680,1,0,0, + 0,679,681,3,104,52,0,680,679,1,0,0,0,680,681,1,0,0,0,681,683,1,0,0,0, + 682,684,3,106,53,0,683,682,1,0,0,0,683,684,1,0,0,0,684,101,1,0,0,0,685, + 686,5,70,0,0,686,687,5,11,0,0,687,688,3,116,58,0,688,103,1,0,0,0,689, + 690,5,67,0,0,690,691,5,11,0,0,691,692,3,90,45,0,692,105,1,0,0,0,693,694, + 7,9,0,0,694,695,3,108,54,0,695,107,1,0,0,0,696,703,3,110,55,0,697,698, + 5,9,0,0,698,699,3,110,55,0,699,700,5,2,0,0,700,701,3,110,55,0,701,703, + 1,0,0,0,702,696,1,0,0,0,702,697,1,0,0,0,703,109,1,0,0,0,704,705,5,19, + 0,0,705,717,5,78,0,0,706,707,5,97,0,0,707,717,5,71,0,0,708,709,5,97,0, + 0,709,717,5,33,0,0,710,711,3,146,73,0,711,712,5,71,0,0,712,717,1,0,0, + 0,713,714,3,146,73,0,714,715,5,33,0,0,715,717,1,0,0,0,716,704,1,0,0,0, + 716,706,1,0,0,0,716,708,1,0,0,0,716,710,1,0,0,0,716,713,1,0,0,0,717,111, + 1,0,0,0,718,719,3,118,59,0,719,720,5,0,0,1,720,113,1,0,0,0,721,778,3, + 158,79,0,722,723,3,158,79,0,723,724,5,133,0,0,724,725,3,158,79,0,725, + 732,3,114,57,0,726,727,5,119,0,0,727,728,3,158,79,0,728,729,3,114,57, + 0,729,731,1,0,0,0,730,726,1,0,0,0,731,734,1,0,0,0,732,730,1,0,0,0,732, + 733,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,735,737,5,119,0,0,736,735, + 1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,739,5,152,0,0,739,778,1,0, + 0,0,740,741,3,158,79,0,741,742,5,133,0,0,742,747,3,160,80,0,743,744,5, + 119,0,0,744,746,3,160,80,0,745,743,1,0,0,0,746,749,1,0,0,0,747,745,1, + 0,0,0,747,748,1,0,0,0,748,751,1,0,0,0,749,747,1,0,0,0,750,752,5,119,0, + 0,751,750,1,0,0,0,751,752,1,0,0,0,752,753,1,0,0,0,753,754,5,152,0,0,754, + 778,1,0,0,0,755,756,3,158,79,0,756,757,5,133,0,0,757,762,3,114,57,0,758, + 759,5,119,0,0,759,761,3,114,57,0,760,758,1,0,0,0,761,764,1,0,0,0,762, + 760,1,0,0,0,762,763,1,0,0,0,763,766,1,0,0,0,764,762,1,0,0,0,765,767,5, + 119,0,0,766,765,1,0,0,0,766,767,1,0,0,0,767,768,1,0,0,0,768,769,5,152, + 0,0,769,778,1,0,0,0,770,771,3,158,79,0,771,773,5,133,0,0,772,774,3,116, + 58,0,773,772,1,0,0,0,773,774,1,0,0,0,774,775,1,0,0,0,775,776,5,152,0, + 0,776,778,1,0,0,0,777,721,1,0,0,0,777,722,1,0,0,0,777,740,1,0,0,0,777, + 755,1,0,0,0,777,770,1,0,0,0,778,115,1,0,0,0,779,784,3,118,59,0,780,781, + 5,119,0,0,781,783,3,118,59,0,782,780,1,0,0,0,783,786,1,0,0,0,784,782, + 1,0,0,0,784,785,1,0,0,0,785,788,1,0,0,0,786,784,1,0,0,0,787,789,5,119, + 0,0,788,787,1,0,0,0,788,789,1,0,0,0,789,117,1,0,0,0,790,791,6,59,-1,0, + 791,793,5,12,0,0,792,794,3,118,59,0,793,792,1,0,0,0,793,794,1,0,0,0,794, + 800,1,0,0,0,795,796,5,101,0,0,796,797,3,118,59,0,797,798,5,86,0,0,798, + 799,3,118,59,0,799,801,1,0,0,0,800,795,1,0,0,0,801,802,1,0,0,0,802,800, + 1,0,0,0,802,803,1,0,0,0,803,806,1,0,0,0,804,805,5,25,0,0,805,807,3,118, + 59,0,806,804,1,0,0,0,806,807,1,0,0,0,807,808,1,0,0,0,808,809,5,26,0,0, + 809,941,1,0,0,0,810,811,5,13,0,0,811,812,5,133,0,0,812,813,3,118,59,0, + 813,814,5,6,0,0,814,815,3,114,57,0,815,816,5,152,0,0,816,941,1,0,0,0, + 817,818,5,20,0,0,818,941,5,113,0,0,819,820,5,48,0,0,820,821,3,118,59, + 0,821,822,3,150,75,0,822,941,1,0,0,0,823,824,5,85,0,0,824,825,5,133,0, + 0,825,826,3,118,59,0,826,827,5,35,0,0,827,830,3,118,59,0,828,829,5,34, + 0,0,829,831,3,118,59,0,830,828,1,0,0,0,830,831,1,0,0,0,831,832,1,0,0, + 0,832,833,5,152,0,0,833,941,1,0,0,0,834,835,5,89,0,0,835,941,5,113,0, + 0,836,837,5,94,0,0,837,838,5,133,0,0,838,839,7,10,0,0,839,840,3,164,82, + 0,840,841,5,35,0,0,841,842,3,118,59,0,842,843,5,152,0,0,843,941,1,0,0, + 0,844,845,3,158,79,0,845,847,5,133,0,0,846,848,3,116,58,0,847,846,1,0, + 0,0,847,848,1,0,0,0,848,849,1,0,0,0,849,850,5,152,0,0,850,859,1,0,0,0, + 851,853,5,133,0,0,852,854,5,24,0,0,853,852,1,0,0,0,853,854,1,0,0,0,854, + 856,1,0,0,0,855,857,3,116,58,0,856,855,1,0,0,0,856,857,1,0,0,0,857,858, + 1,0,0,0,858,860,5,152,0,0,859,851,1,0,0,0,859,860,1,0,0,0,860,861,1,0, + 0,0,861,862,5,69,0,0,862,863,5,133,0,0,863,864,3,100,50,0,864,865,5,152, + 0,0,865,941,1,0,0,0,866,867,3,158,79,0,867,869,5,133,0,0,868,870,3,116, + 58,0,869,868,1,0,0,0,869,870,1,0,0,0,870,871,1,0,0,0,871,872,5,152,0, + 0,872,881,1,0,0,0,873,875,5,133,0,0,874,876,5,24,0,0,875,874,1,0,0,0, + 875,876,1,0,0,0,876,878,1,0,0,0,877,879,3,116,58,0,878,877,1,0,0,0,878, + 879,1,0,0,0,879,880,1,0,0,0,880,882,5,152,0,0,881,873,1,0,0,0,881,882, + 1,0,0,0,882,883,1,0,0,0,883,884,5,69,0,0,884,885,3,158,79,0,885,941,1, + 0,0,0,886,892,3,158,79,0,887,889,5,133,0,0,888,890,3,116,58,0,889,888, + 1,0,0,0,889,890,1,0,0,0,890,891,1,0,0,0,891,893,5,152,0,0,892,887,1,0, + 0,0,892,893,1,0,0,0,893,894,1,0,0,0,894,896,5,133,0,0,895,897,5,24,0, + 0,896,895,1,0,0,0,896,897,1,0,0,0,897,899,1,0,0,0,898,900,3,116,58,0, + 899,898,1,0,0,0,899,900,1,0,0,0,900,901,1,0,0,0,901,902,5,152,0,0,902, + 941,1,0,0,0,903,941,3,122,61,0,904,941,3,166,83,0,905,941,3,148,74,0, + 906,907,5,121,0,0,907,941,3,118,59,20,908,909,5,61,0,0,909,941,3,118, + 59,14,910,911,3,138,69,0,911,912,5,123,0,0,912,914,1,0,0,0,913,910,1, + 0,0,0,913,914,1,0,0,0,914,915,1,0,0,0,915,941,5,115,0,0,916,917,5,133, + 0,0,917,918,3,48,24,0,918,919,5,152,0,0,919,941,1,0,0,0,920,921,5,133, + 0,0,921,922,3,118,59,0,922,923,5,152,0,0,923,941,1,0,0,0,924,925,5,133, + 0,0,925,926,3,116,58,0,926,927,5,152,0,0,927,941,1,0,0,0,928,930,5,132, + 0,0,929,931,3,116,58,0,930,929,1,0,0,0,930,931,1,0,0,0,931,932,1,0,0, + 0,932,941,5,151,0,0,933,935,5,131,0,0,934,936,3,40,20,0,935,934,1,0,0, + 0,935,936,1,0,0,0,936,937,1,0,0,0,937,941,5,150,0,0,938,941,3,120,60, + 0,939,941,3,130,65,0,940,790,1,0,0,0,940,810,1,0,0,0,940,817,1,0,0,0, + 940,819,1,0,0,0,940,823,1,0,0,0,940,834,1,0,0,0,940,836,1,0,0,0,940,844, + 1,0,0,0,940,866,1,0,0,0,940,886,1,0,0,0,940,903,1,0,0,0,940,904,1,0,0, + 0,940,905,1,0,0,0,940,906,1,0,0,0,940,908,1,0,0,0,940,913,1,0,0,0,940, + 916,1,0,0,0,940,920,1,0,0,0,940,924,1,0,0,0,940,928,1,0,0,0,940,933,1, + 0,0,0,940,938,1,0,0,0,940,939,1,0,0,0,941,1052,1,0,0,0,942,946,10,19, + 0,0,943,947,5,115,0,0,944,947,5,154,0,0,945,947,5,141,0,0,946,943,1,0, + 0,0,946,944,1,0,0,0,946,945,1,0,0,0,947,948,1,0,0,0,948,1051,3,118,59, + 20,949,953,10,18,0,0,950,954,5,142,0,0,951,954,5,121,0,0,952,954,5,120, + 0,0,953,950,1,0,0,0,953,951,1,0,0,0,953,952,1,0,0,0,954,955,1,0,0,0,955, + 1051,3,118,59,19,956,981,10,17,0,0,957,982,5,124,0,0,958,982,5,125,0, + 0,959,982,5,136,0,0,960,982,5,134,0,0,961,982,5,135,0,0,962,982,5,126, + 0,0,963,982,5,127,0,0,964,966,5,61,0,0,965,964,1,0,0,0,965,966,1,0,0, + 0,966,967,1,0,0,0,967,969,5,44,0,0,968,970,5,15,0,0,969,968,1,0,0,0,969, + 970,1,0,0,0,970,982,1,0,0,0,971,973,5,61,0,0,972,971,1,0,0,0,972,973, + 1,0,0,0,973,974,1,0,0,0,974,982,7,11,0,0,975,982,5,148,0,0,976,982,5, + 149,0,0,977,982,5,138,0,0,978,982,5,129,0,0,979,982,5,130,0,0,980,982, + 5,137,0,0,981,957,1,0,0,0,981,958,1,0,0,0,981,959,1,0,0,0,981,960,1,0, + 0,0,981,961,1,0,0,0,981,962,1,0,0,0,981,963,1,0,0,0,981,965,1,0,0,0,981, + 972,1,0,0,0,981,975,1,0,0,0,981,976,1,0,0,0,981,977,1,0,0,0,981,978,1, + 0,0,0,981,979,1,0,0,0,981,980,1,0,0,0,982,983,1,0,0,0,983,1051,3,118, + 59,18,984,985,10,15,0,0,985,986,5,140,0,0,986,1051,3,118,59,16,987,988, + 10,13,0,0,988,989,5,2,0,0,989,1051,3,118,59,14,990,991,10,12,0,0,991, + 992,5,66,0,0,992,1051,3,118,59,13,993,995,10,11,0,0,994,996,5,61,0,0, + 995,994,1,0,0,0,995,996,1,0,0,0,996,997,1,0,0,0,997,998,5,9,0,0,998,999, + 3,118,59,0,999,1000,5,2,0,0,1000,1001,3,118,59,12,1001,1051,1,0,0,0,1002, + 1003,10,10,0,0,1003,1004,5,143,0,0,1004,1005,3,118,59,0,1005,1006,5,118, + 0,0,1006,1007,3,118,59,10,1007,1051,1,0,0,0,1008,1009,10,30,0,0,1009, + 1011,5,133,0,0,1010,1012,3,116,58,0,1011,1010,1,0,0,0,1011,1012,1,0,0, + 0,1012,1013,1,0,0,0,1013,1051,5,152,0,0,1014,1015,10,26,0,0,1015,1016, + 5,132,0,0,1016,1017,3,118,59,0,1017,1018,5,151,0,0,1018,1051,1,0,0,0, + 1019,1020,10,25,0,0,1020,1021,5,123,0,0,1021,1051,5,111,0,0,1022,1023, + 10,24,0,0,1023,1024,5,123,0,0,1024,1051,3,158,79,0,1025,1026,10,23,0, + 0,1026,1027,5,139,0,0,1027,1028,5,132,0,0,1028,1029,3,118,59,0,1029,1030, + 5,151,0,0,1030,1051,1,0,0,0,1031,1032,10,22,0,0,1032,1033,5,139,0,0,1033, + 1051,5,111,0,0,1034,1035,10,21,0,0,1035,1036,5,139,0,0,1036,1051,3,158, + 79,0,1037,1038,10,16,0,0,1038,1040,5,49,0,0,1039,1041,5,61,0,0,1040,1039, + 1,0,0,0,1040,1041,1,0,0,0,1041,1042,1,0,0,0,1042,1051,5,62,0,0,1043,1048, + 10,9,0,0,1044,1045,5,6,0,0,1045,1049,3,158,79,0,1046,1047,5,6,0,0,1047, + 1049,5,113,0,0,1048,1044,1,0,0,0,1048,1046,1,0,0,0,1049,1051,1,0,0,0, + 1050,942,1,0,0,0,1050,949,1,0,0,0,1050,956,1,0,0,0,1050,984,1,0,0,0,1050, + 987,1,0,0,0,1050,990,1,0,0,0,1050,993,1,0,0,0,1050,1002,1,0,0,0,1050, + 1008,1,0,0,0,1050,1014,1,0,0,0,1050,1019,1,0,0,0,1050,1022,1,0,0,0,1050, + 1025,1,0,0,0,1050,1031,1,0,0,0,1050,1034,1,0,0,0,1050,1037,1,0,0,0,1050, + 1043,1,0,0,0,1051,1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053,1,0,0,0,1053, + 119,1,0,0,0,1054,1052,1,0,0,0,1055,1056,5,133,0,0,1056,1061,3,158,79, + 0,1057,1058,5,119,0,0,1058,1060,3,158,79,0,1059,1057,1,0,0,0,1060,1063, + 1,0,0,0,1061,1059,1,0,0,0,1061,1062,1,0,0,0,1062,1065,1,0,0,0,1063,1061, + 1,0,0,0,1064,1066,5,119,0,0,1065,1064,1,0,0,0,1065,1066,1,0,0,0,1066, + 1067,1,0,0,0,1067,1068,5,152,0,0,1068,1083,1,0,0,0,1069,1074,3,158,79, + 0,1070,1071,5,119,0,0,1071,1073,3,158,79,0,1072,1070,1,0,0,0,1073,1076, + 1,0,0,0,1074,1072,1,0,0,0,1074,1075,1,0,0,0,1075,1078,1,0,0,0,1076,1074, + 1,0,0,0,1077,1079,5,119,0,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079, + 1083,1,0,0,0,1080,1081,5,133,0,0,1081,1083,5,152,0,0,1082,1055,1,0,0, + 0,1082,1069,1,0,0,0,1082,1080,1,0,0,0,1083,1084,1,0,0,0,1084,1087,5,114, + 0,0,1085,1088,3,118,59,0,1086,1088,3,36,18,0,1087,1085,1,0,0,0,1087,1086, + 1,0,0,0,1088,121,1,0,0,0,1089,1090,5,135,0,0,1090,1094,3,158,79,0,1091, + 1093,3,124,62,0,1092,1091,1,0,0,0,1093,1096,1,0,0,0,1094,1092,1,0,0,0, + 1094,1095,1,0,0,0,1095,1097,1,0,0,0,1096,1094,1,0,0,0,1097,1098,5,154, + 0,0,1098,1099,5,127,0,0,1099,1122,1,0,0,0,1100,1101,5,135,0,0,1101,1105, + 3,158,79,0,1102,1104,3,124,62,0,1103,1102,1,0,0,0,1104,1107,1,0,0,0,1105, + 1103,1,0,0,0,1105,1106,1,0,0,0,1106,1108,1,0,0,0,1107,1105,1,0,0,0,1108, + 1114,5,127,0,0,1109,1115,3,122,61,0,1110,1111,5,131,0,0,1111,1112,3,118, + 59,0,1112,1113,5,150,0,0,1113,1115,1,0,0,0,1114,1109,1,0,0,0,1114,1110, + 1,0,0,0,1114,1115,1,0,0,0,1115,1116,1,0,0,0,1116,1117,5,135,0,0,1117, + 1118,5,154,0,0,1118,1119,3,158,79,0,1119,1120,5,127,0,0,1120,1122,1,0, + 0,0,1121,1089,1,0,0,0,1121,1100,1,0,0,0,1122,123,1,0,0,0,1123,1124,3, + 158,79,0,1124,1125,5,125,0,0,1125,1126,3,164,82,0,1126,1135,1,0,0,0,1127, + 1128,3,158,79,0,1128,1129,5,125,0,0,1129,1130,5,131,0,0,1130,1131,3,118, + 59,0,1131,1132,5,150,0,0,1132,1135,1,0,0,0,1133,1135,3,158,79,0,1134, + 1123,1,0,0,0,1134,1127,1,0,0,0,1134,1133,1,0,0,0,1135,125,1,0,0,0,1136, + 1141,3,128,64,0,1137,1138,5,119,0,0,1138,1140,3,128,64,0,1139,1137,1, + 0,0,0,1140,1143,1,0,0,0,1141,1139,1,0,0,0,1141,1142,1,0,0,0,1142,1145, + 1,0,0,0,1143,1141,1,0,0,0,1144,1146,5,119,0,0,1145,1144,1,0,0,0,1145, + 1146,1,0,0,0,1146,127,1,0,0,0,1147,1148,3,158,79,0,1148,1149,5,6,0,0, + 1149,1150,5,133,0,0,1150,1151,3,48,24,0,1151,1152,5,152,0,0,1152,1158, + 1,0,0,0,1153,1154,3,118,59,0,1154,1155,5,6,0,0,1155,1156,3,158,79,0,1156, + 1158,1,0,0,0,1157,1147,1,0,0,0,1157,1153,1,0,0,0,1158,129,1,0,0,0,1159, + 1167,3,162,81,0,1160,1161,3,138,69,0,1161,1162,5,123,0,0,1162,1164,1, + 0,0,0,1163,1160,1,0,0,0,1163,1164,1,0,0,0,1164,1165,1,0,0,0,1165,1167, + 3,132,66,0,1166,1159,1,0,0,0,1166,1163,1,0,0,0,1167,131,1,0,0,0,1168, + 1173,3,158,79,0,1169,1170,5,123,0,0,1170,1172,3,158,79,0,1171,1169,1, + 0,0,0,1172,1175,1,0,0,0,1173,1171,1,0,0,0,1173,1174,1,0,0,0,1174,133, + 1,0,0,0,1175,1173,1,0,0,0,1176,1177,6,67,-1,0,1177,1186,3,138,69,0,1178, + 1186,3,136,68,0,1179,1180,5,133,0,0,1180,1181,3,48,24,0,1181,1182,5,152, + 0,0,1182,1186,1,0,0,0,1183,1186,3,122,61,0,1184,1186,3,162,81,0,1185, + 1176,1,0,0,0,1185,1178,1,0,0,0,1185,1179,1,0,0,0,1185,1183,1,0,0,0,1185, + 1184,1,0,0,0,1186,1195,1,0,0,0,1187,1191,10,3,0,0,1188,1192,3,156,78, + 0,1189,1190,5,6,0,0,1190,1192,3,158,79,0,1191,1188,1,0,0,0,1191,1189, + 1,0,0,0,1192,1194,1,0,0,0,1193,1187,1,0,0,0,1194,1197,1,0,0,0,1195,1193, + 1,0,0,0,1195,1196,1,0,0,0,1196,135,1,0,0,0,1197,1195,1,0,0,0,1198,1199, + 3,158,79,0,1199,1201,5,133,0,0,1200,1202,3,140,70,0,1201,1200,1,0,0,0, + 1201,1202,1,0,0,0,1202,1203,1,0,0,0,1203,1204,5,152,0,0,1204,137,1,0, + 0,0,1205,1206,3,142,71,0,1206,1207,5,123,0,0,1207,1209,1,0,0,0,1208,1205, + 1,0,0,0,1208,1209,1,0,0,0,1209,1210,1,0,0,0,1210,1211,3,158,79,0,1211, + 139,1,0,0,0,1212,1217,3,118,59,0,1213,1214,5,119,0,0,1214,1216,3,118, + 59,0,1215,1213,1,0,0,0,1216,1219,1,0,0,0,1217,1215,1,0,0,0,1217,1218, + 1,0,0,0,1218,1221,1,0,0,0,1219,1217,1,0,0,0,1220,1222,5,119,0,0,1221, + 1220,1,0,0,0,1221,1222,1,0,0,0,1222,141,1,0,0,0,1223,1224,3,158,79,0, + 1224,143,1,0,0,0,1225,1234,5,109,0,0,1226,1227,5,123,0,0,1227,1234,7, + 12,0,0,1228,1229,5,111,0,0,1229,1231,5,123,0,0,1230,1232,7,12,0,0,1231, + 1230,1,0,0,0,1231,1232,1,0,0,0,1232,1234,1,0,0,0,1233,1225,1,0,0,0,1233, + 1226,1,0,0,0,1233,1228,1,0,0,0,1234,145,1,0,0,0,1235,1237,7,13,0,0,1236, + 1235,1,0,0,0,1236,1237,1,0,0,0,1237,1244,1,0,0,0,1238,1245,3,144,72,0, + 1239,1245,5,110,0,0,1240,1245,5,111,0,0,1241,1245,5,112,0,0,1242,1245, + 5,45,0,0,1243,1245,5,60,0,0,1244,1238,1,0,0,0,1244,1239,1,0,0,0,1244, + 1240,1,0,0,0,1244,1241,1,0,0,0,1244,1242,1,0,0,0,1244,1243,1,0,0,0,1245, + 147,1,0,0,0,1246,1250,3,146,73,0,1247,1250,5,113,0,0,1248,1250,5,62,0, + 0,1249,1246,1,0,0,0,1249,1247,1,0,0,0,1249,1248,1,0,0,0,1250,149,1,0, + 0,0,1251,1252,7,14,0,0,1252,151,1,0,0,0,1253,1254,7,15,0,0,1254,153,1, + 0,0,0,1255,1256,7,16,0,0,1256,155,1,0,0,0,1257,1260,5,108,0,0,1258,1260, + 3,154,77,0,1259,1257,1,0,0,0,1259,1258,1,0,0,0,1260,157,1,0,0,0,1261, + 1265,5,108,0,0,1262,1265,3,150,75,0,1263,1265,3,152,76,0,1264,1261,1, + 0,0,0,1264,1262,1,0,0,0,1264,1263,1,0,0,0,1265,159,1,0,0,0,1266,1267, + 3,164,82,0,1267,1268,5,125,0,0,1268,1269,3,146,73,0,1269,161,1,0,0,0, + 1270,1271,5,131,0,0,1271,1272,3,118,59,0,1272,1273,5,150,0,0,1273,163, + 1,0,0,0,1274,1277,5,113,0,0,1275,1277,3,166,83,0,1276,1274,1,0,0,0,1276, + 1275,1,0,0,0,1277,165,1,0,0,0,1278,1282,5,145,0,0,1279,1281,3,168,84, + 0,1280,1279,1,0,0,0,1281,1284,1,0,0,0,1282,1280,1,0,0,0,1282,1283,1,0, + 0,0,1283,1285,1,0,0,0,1284,1282,1,0,0,0,1285,1286,5,147,0,0,1286,167, + 1,0,0,0,1287,1288,5,160,0,0,1288,1289,3,118,59,0,1289,1290,5,150,0,0, + 1290,1293,1,0,0,0,1291,1293,5,159,0,0,1292,1287,1,0,0,0,1292,1291,1,0, + 0,0,1293,169,1,0,0,0,1294,1298,5,146,0,0,1295,1297,3,172,86,0,1296,1295, + 1,0,0,0,1297,1300,1,0,0,0,1298,1296,1,0,0,0,1298,1299,1,0,0,0,1299,1301, + 1,0,0,0,1300,1298,1,0,0,0,1301,1302,5,0,0,1,1302,171,1,0,0,0,1303,1304, + 5,162,0,0,1304,1305,3,118,59,0,1305,1306,5,150,0,0,1306,1309,1,0,0,0, + 1307,1309,5,161,0,0,1308,1303,1,0,0,0,1308,1307,1,0,0,0,1309,173,1,0, + 0,0,168,177,184,193,200,204,218,222,225,229,232,239,243,252,257,266,274, + 281,285,291,296,304,311,317,329,337,351,355,360,370,376,384,388,392,395, + 399,402,405,408,411,415,419,422,425,428,432,435,444,450,471,488,505,511, + 517,528,530,541,544,550,558,564,566,570,575,578,581,585,589,592,594,597, + 601,605,608,610,612,617,628,634,641,646,650,654,660,662,669,677,680,683, + 702,716,732,736,747,751,762,766,773,777,784,788,793,802,806,830,847,853, + 856,859,869,875,878,881,889,892,896,899,913,930,935,940,946,953,965,969, + 972,981,995,1011,1040,1048,1050,1052,1061,1065,1074,1078,1082,1087,1094, + 1105,1114,1121,1134,1141,1145,1157,1163,1166,1173,1185,1191,1195,1201, + 1208,1217,1221,1231,1233,1236,1244,1249,1259,1264,1276,1282,1292,1298, + 1308 }; staticData->serializedATN = antlr4::atn::SerializedATNView(serializedATNSegment, sizeof(serializedATNSegment) / sizeof(serializedATNSegment[0])); @@ -693,20 +699,20 @@ HogQLParser::ProgramContext* HogQLParser::program() { }); try { enterOuterAlt(_localctx, 1); - setState(175); + setState(177); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -536887298) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986211001696255) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 4212759) != 0)) { - setState(172); + ((1ULL << _la) & -140738696331266) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944844006785023) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 4212759) != 0)) { + setState(174); declaration(); - setState(177); + setState(179); _errHandler->sync(this); _la = _input->LA(1); } - setState(178); + setState(180); match(HogQLParser::EOF); } @@ -758,12 +764,12 @@ HogQLParser::DeclarationContext* HogQLParser::declaration() { exitRule(); }); try { - setState(182); + setState(184); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LET: { enterOuterAlt(_localctx, 1); - setState(180); + setState(182); varDecl(); break; } @@ -886,7 +892,7 @@ HogQLParser::DeclarationContext* HogQLParser::declaration() { case HogQLParser::QUOTE_SINGLE_TEMPLATE: case HogQLParser::SEMICOLON: { enterOuterAlt(_localctx, 2); - setState(181); + setState(183); statement(); break; } @@ -941,7 +947,7 @@ HogQLParser::ExpressionContext* HogQLParser::expression() { }); try { enterOuterAlt(_localctx, 1); - setState(184); + setState(186); columnExpr(0); } @@ -1007,20 +1013,20 @@ HogQLParser::VarDeclContext* HogQLParser::varDecl() { }); try { enterOuterAlt(_localctx, 1); - setState(186); + setState(188); match(HogQLParser::LET); - setState(187); + setState(189); identifier(); - setState(191); + setState(193); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COLON) { - setState(188); + setState(190); match(HogQLParser::COLON); - setState(189); + setState(191); match(HogQLParser::EQ_SINGLE); - setState(190); + setState(192); expression(); } @@ -1084,28 +1090,28 @@ HogQLParser::IdentifierListContext* HogQLParser::identifierList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(193); + setState(195); identifier(); - setState(198); + setState(200); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 3, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(194); + setState(196); match(HogQLParser::COMMA); - setState(195); + setState(197); identifier(); } - setState(200); + setState(202); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 3, _ctx); } - setState(202); + setState(204); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(201); + setState(203); match(HogQLParser::COMMA); } @@ -1198,89 +1204,89 @@ HogQLParser::StatementContext* HogQLParser::statement() { exitRule(); }); try { - setState(216); + setState(218); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 5, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(204); + setState(206); returnStmt(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(205); + setState(207); throwStmt(); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(206); + setState(208); tryCatchStmt(); break; } case 4: { enterOuterAlt(_localctx, 4); - setState(207); + setState(209); ifStmt(); break; } case 5: { enterOuterAlt(_localctx, 5); - setState(208); + setState(210); whileStmt(); break; } case 6: { enterOuterAlt(_localctx, 6); - setState(209); + setState(211); forInStmt(); break; } case 7: { enterOuterAlt(_localctx, 7); - setState(210); + setState(212); forStmt(); break; } case 8: { enterOuterAlt(_localctx, 8); - setState(211); + setState(213); funcStmt(); break; } case 9: { enterOuterAlt(_localctx, 9); - setState(212); + setState(214); varAssignment(); break; } case 10: { enterOuterAlt(_localctx, 10); - setState(213); + setState(215); block(); break; } case 11: { enterOuterAlt(_localctx, 11); - setState(214); + setState(216); exprStmt(); break; } case 12: { enterOuterAlt(_localctx, 12); - setState(215); + setState(217); emptyStmt(); break; } @@ -1343,14 +1349,14 @@ HogQLParser::ReturnStmtContext* HogQLParser::returnStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(218); - match(HogQLParser::RETURN); setState(220); + match(HogQLParser::RETURN); + setState(222); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 6, _ctx)) { case 1: { - setState(219); + setState(221); expression(); break; } @@ -1358,12 +1364,12 @@ HogQLParser::ReturnStmtContext* HogQLParser::returnStmt() { default: break; } - setState(223); + setState(225); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 7, _ctx)) { case 1: { - setState(222); + setState(224); match(HogQLParser::SEMICOLON); break; } @@ -1426,14 +1432,14 @@ HogQLParser::ThrowStmtContext* HogQLParser::throwStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(225); - match(HogQLParser::THROW); setState(227); + match(HogQLParser::THROW); + setState(229); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 8, _ctx)) { case 1: { - setState(226); + setState(228); expression(); break; } @@ -1441,12 +1447,12 @@ HogQLParser::ThrowStmtContext* HogQLParser::throwStmt() { default: break; } - setState(230); + setState(232); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 9, _ctx)) { case 1: { - setState(229); + setState(231); match(HogQLParser::SEMICOLON); break; } @@ -1526,31 +1532,31 @@ HogQLParser::CatchBlockContext* HogQLParser::catchBlock() { }); try { enterOuterAlt(_localctx, 1); - setState(232); + setState(234); match(HogQLParser::CATCH); - setState(241); + setState(243); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::LPAREN) { - setState(233); + setState(235); match(HogQLParser::LPAREN); - setState(234); + setState(236); antlrcpp::downCast(_localctx)->catchVar = identifier(); - setState(237); + setState(239); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COLON) { - setState(235); + setState(237); match(HogQLParser::COLON); - setState(236); + setState(238); antlrcpp::downCast(_localctx)->catchType = identifier(); } - setState(239); + setState(241); match(HogQLParser::RPAREN); } - setState(243); + setState(245); antlrcpp::downCast(_localctx)->catchStmt = block(); } @@ -1620,28 +1626,28 @@ HogQLParser::TryCatchStmtContext* HogQLParser::tryCatchStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(245); + setState(247); match(HogQLParser::TRY); - setState(246); + setState(248); antlrcpp::downCast(_localctx)->tryStmt = block(); - setState(250); + setState(252); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::CATCH) { - setState(247); + setState(249); catchBlock(); - setState(252); + setState(254); _errHandler->sync(this); _la = _input->LA(1); } - setState(255); + setState(257); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::FINALLY) { - setState(253); + setState(255); match(HogQLParser::FINALLY); - setState(254); + setState(256); antlrcpp::downCast(_localctx)->finallyStmt = block(); } @@ -1715,24 +1721,24 @@ HogQLParser::IfStmtContext* HogQLParser::ifStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(257); + setState(259); match(HogQLParser::IF); - setState(258); + setState(260); match(HogQLParser::LPAREN); - setState(259); + setState(261); expression(); - setState(260); + setState(262); match(HogQLParser::RPAREN); - setState(261); + setState(263); statement(); - setState(264); + setState(266); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 14, _ctx)) { case 1: { - setState(262); + setState(264); match(HogQLParser::ELSE); - setState(263); + setState(265); statement(); break; } @@ -1807,22 +1813,22 @@ HogQLParser::WhileStmtContext* HogQLParser::whileStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(266); + setState(268); match(HogQLParser::WHILE); - setState(267); + setState(269); match(HogQLParser::LPAREN); - setState(268); + setState(270); expression(); - setState(269); + setState(271); match(HogQLParser::RPAREN); - setState(270); - statement(); setState(272); + statement(); + setState(274); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 15, _ctx)) { case 1: { - setState(271); + setState(273); match(HogQLParser::SEMICOLON); break; } @@ -1922,28 +1928,28 @@ HogQLParser::ForStmtContext* HogQLParser::forStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(274); + setState(276); match(HogQLParser::FOR); - setState(275); + setState(277); match(HogQLParser::LPAREN); - setState(279); + setState(281); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 16, _ctx)) { case 1: { - setState(276); + setState(278); antlrcpp::downCast(_localctx)->initializerVarDeclr = varDecl(); break; } case 2: { - setState(277); + setState(279); antlrcpp::downCast(_localctx)->initializerVarAssignment = varAssignment(); break; } case 3: { - setState(278); + setState(280); antlrcpp::downCast(_localctx)->initializerExpression = expression(); break; } @@ -1951,39 +1957,39 @@ HogQLParser::ForStmtContext* HogQLParser::forStmt() { default: break; } - setState(281); - match(HogQLParser::SEMICOLON); setState(283); + match(HogQLParser::SEMICOLON); + setState(285); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(282); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(284); antlrcpp::downCast(_localctx)->condition = expression(); } - setState(285); + setState(287); match(HogQLParser::SEMICOLON); - setState(289); + setState(291); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 18, _ctx)) { case 1: { - setState(286); + setState(288); antlrcpp::downCast(_localctx)->incrementVarDeclr = varDecl(); break; } case 2: { - setState(287); + setState(289); antlrcpp::downCast(_localctx)->incrementVarAssignment = varAssignment(); break; } case 3: { - setState(288); + setState(290); antlrcpp::downCast(_localctx)->incrementExpression = expression(); break; } @@ -1991,16 +1997,16 @@ HogQLParser::ForStmtContext* HogQLParser::forStmt() { default: break; } - setState(291); + setState(293); match(HogQLParser::RPAREN); - setState(292); - statement(); setState(294); + statement(); + setState(296); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 19, _ctx)) { case 1: { - setState(293); + setState(295); match(HogQLParser::SEMICOLON); break; } @@ -2096,38 +2102,38 @@ HogQLParser::ForInStmtContext* HogQLParser::forInStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(296); + setState(298); match(HogQLParser::FOR); - setState(297); + setState(299); match(HogQLParser::LPAREN); - setState(298); + setState(300); match(HogQLParser::LET); - setState(299); + setState(301); identifier(); - setState(302); + setState(304); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(300); + setState(302); match(HogQLParser::COMMA); - setState(301); + setState(303); identifier(); } - setState(304); + setState(306); match(HogQLParser::IN); - setState(305); + setState(307); expression(); - setState(306); + setState(308); match(HogQLParser::RPAREN); - setState(307); - statement(); setState(309); + statement(); + setState(311); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 21, _ctx)) { case 1: { - setState(308); + setState(310); match(HogQLParser::SEMICOLON); break; } @@ -2207,7 +2213,7 @@ HogQLParser::FuncStmtContext* HogQLParser::funcStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(311); + setState(313); _la = _input->LA(1); if (!(_la == HogQLParser::FN @@ -2218,23 +2224,23 @@ HogQLParser::FuncStmtContext* HogQLParser::funcStmt() { _errHandler->reportMatch(this); consume(); } - setState(312); + setState(314); identifier(); - setState(313); - match(HogQLParser::LPAREN); setState(315); + match(HogQLParser::LPAREN); + setState(317); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(314); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(316); identifierList(); } - setState(317); + setState(319); match(HogQLParser::RPAREN); - setState(318); + setState(320); block(); } @@ -2295,13 +2301,13 @@ HogQLParser::VarAssignmentContext* HogQLParser::varAssignment() { }); try { enterOuterAlt(_localctx, 1); - setState(320); + setState(322); expression(); - setState(321); + setState(323); match(HogQLParser::COLON); - setState(322); + setState(324); match(HogQLParser::EQ_SINGLE); - setState(323); + setState(325); expression(); } @@ -2354,14 +2360,14 @@ HogQLParser::ExprStmtContext* HogQLParser::exprStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(325); - expression(); setState(327); + expression(); + setState(329); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 23, _ctx)) { case 1: { - setState(326); + setState(328); match(HogQLParser::SEMICOLON); break; } @@ -2416,7 +2422,7 @@ HogQLParser::EmptyStmtContext* HogQLParser::emptyStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(329); + setState(331); match(HogQLParser::SEMICOLON); } @@ -2478,22 +2484,22 @@ HogQLParser::BlockContext* HogQLParser::block() { }); try { enterOuterAlt(_localctx, 1); - setState(331); + setState(333); match(HogQLParser::LBRACE); - setState(335); + setState(337); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -536887298) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986211001696255) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 4212759) != 0)) { - setState(332); + ((1ULL << _la) & -140738696331266) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944844006785023) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 4212759) != 0)) { + setState(334); declaration(); - setState(337); + setState(339); _errHandler->sync(this); _la = _input->LA(1); } - setState(338); + setState(340); match(HogQLParser::RBRACE); } @@ -2550,11 +2556,11 @@ HogQLParser::KvPairContext* HogQLParser::kvPair() { }); try { enterOuterAlt(_localctx, 1); - setState(340); + setState(342); expression(); - setState(341); + setState(343); match(HogQLParser::COLON); - setState(342); + setState(344); expression(); } @@ -2617,28 +2623,28 @@ HogQLParser::KvPairListContext* HogQLParser::kvPairList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(344); + setState(346); kvPair(); - setState(349); + setState(351); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 25, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(345); + setState(347); match(HogQLParser::COMMA); - setState(346); + setState(348); kvPair(); } - setState(351); + setState(353); _errHandler->sync(this); alt = getInterpreter()->adaptivePredict(_input, 25, _ctx); } - setState(353); + setState(355); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(352); + setState(354); match(HogQLParser::COMMA); } @@ -2662,8 +2668,8 @@ tree::TerminalNode* HogQLParser::SelectContext::EOF() { return getToken(HogQLParser::EOF, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::SelectContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::SelectContext::selectSetStmt() { + return getRuleContext(0); } HogQLParser::SelectStmtContext* HogQLParser::SelectContext::selectStmt() { @@ -2700,23 +2706,23 @@ HogQLParser::SelectContext* HogQLParser::select() { }); try { enterOuterAlt(_localctx, 1); - setState(358); + setState(360); _errHandler->sync(this); switch (getInterpreter()->adaptivePredict(_input, 27, _ctx)) { case 1: { - setState(355); - selectUnionStmt(); + setState(357); + selectSetStmt(); break; } case 2: { - setState(356); + setState(358); selectStmt(); break; } case 3: { - setState(357); + setState(359); hogqlxTagElement(); break; } @@ -2724,7 +2730,7 @@ HogQLParser::SelectContext* HogQLParser::select() { default: break; } - setState(360); + setState(362); match(HogQLParser::EOF); } @@ -2737,53 +2743,48 @@ HogQLParser::SelectContext* HogQLParser::select() { return _localctx; } -//----------------- SelectUnionStmtContext ------------------------------------------------------------------ +//----------------- SelectStmtWithParensContext ------------------------------------------------------------------ -HogQLParser::SelectUnionStmtContext::SelectUnionStmtContext(ParserRuleContext *parent, size_t invokingState) +HogQLParser::SelectStmtWithParensContext::SelectStmtWithParensContext(ParserRuleContext *parent, size_t invokingState) : ParserRuleContext(parent, invokingState) { } -std::vector HogQLParser::SelectUnionStmtContext::selectStmtWithParens() { - return getRuleContexts(); -} - -HogQLParser::SelectStmtWithParensContext* HogQLParser::SelectUnionStmtContext::selectStmtWithParens(size_t i) { - return getRuleContext(i); +HogQLParser::SelectStmtContext* HogQLParser::SelectStmtWithParensContext::selectStmt() { + return getRuleContext(0); } -std::vector HogQLParser::SelectUnionStmtContext::UNION() { - return getTokens(HogQLParser::UNION); +tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::LPAREN() { + return getToken(HogQLParser::LPAREN, 0); } -tree::TerminalNode* HogQLParser::SelectUnionStmtContext::UNION(size_t i) { - return getToken(HogQLParser::UNION, i); +HogQLParser::SelectSetStmtContext* HogQLParser::SelectStmtWithParensContext::selectSetStmt() { + return getRuleContext(0); } -std::vector HogQLParser::SelectUnionStmtContext::ALL() { - return getTokens(HogQLParser::ALL); +tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::RPAREN() { + return getToken(HogQLParser::RPAREN, 0); } -tree::TerminalNode* HogQLParser::SelectUnionStmtContext::ALL(size_t i) { - return getToken(HogQLParser::ALL, i); +HogQLParser::PlaceholderContext* HogQLParser::SelectStmtWithParensContext::placeholder() { + return getRuleContext(0); } -size_t HogQLParser::SelectUnionStmtContext::getRuleIndex() const { - return HogQLParser::RuleSelectUnionStmt; +size_t HogQLParser::SelectStmtWithParensContext::getRuleIndex() const { + return HogQLParser::RuleSelectStmtWithParens; } -std::any HogQLParser::SelectUnionStmtContext::accept(tree::ParseTreeVisitor *visitor) { +std::any HogQLParser::SelectStmtWithParensContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) - return parserVisitor->visitSelectUnionStmt(this); + return parserVisitor->visitSelectStmtWithParens(this); else return visitor->visitChildren(this); } -HogQLParser::SelectUnionStmtContext* HogQLParser::selectUnionStmt() { - SelectUnionStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 44, HogQLParser::RuleSelectUnionStmt); - size_t _la = 0; +HogQLParser::SelectStmtWithParensContext* HogQLParser::selectStmtWithParens() { + SelectStmtWithParensContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 44, HogQLParser::RuleSelectStmtWithParens); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2793,22 +2794,37 @@ HogQLParser::SelectUnionStmtContext* HogQLParser::selectUnionStmt() { exitRule(); }); try { - enterOuterAlt(_localctx, 1); - setState(362); - selectStmtWithParens(); - setState(368); + setState(370); _errHandler->sync(this); - _la = _input->LA(1); - while (_la == HogQLParser::UNION) { - setState(363); - match(HogQLParser::UNION); - setState(364); - match(HogQLParser::ALL); - setState(365); - selectStmtWithParens(); - setState(370); - _errHandler->sync(this); - _la = _input->LA(1); + switch (_input->LA(1)) { + case HogQLParser::SELECT: + case HogQLParser::WITH: { + enterOuterAlt(_localctx, 1); + setState(364); + selectStmt(); + break; + } + + case HogQLParser::LPAREN: { + enterOuterAlt(_localctx, 2); + setState(365); + match(HogQLParser::LPAREN); + setState(366); + selectSetStmt(); + setState(367); + match(HogQLParser::RPAREN); + break; + } + + case HogQLParser::LBRACE: { + enterOuterAlt(_localctx, 3); + setState(369); + placeholder(); + break; + } + + default: + throw NoViableAltException(this); } } @@ -2821,48 +2837,48 @@ HogQLParser::SelectUnionStmtContext* HogQLParser::selectUnionStmt() { return _localctx; } -//----------------- SelectStmtWithParensContext ------------------------------------------------------------------ +//----------------- SubsequentSelectSetClauseContext ------------------------------------------------------------------ -HogQLParser::SelectStmtWithParensContext::SelectStmtWithParensContext(ParserRuleContext *parent, size_t invokingState) +HogQLParser::SubsequentSelectSetClauseContext::SubsequentSelectSetClauseContext(ParserRuleContext *parent, size_t invokingState) : ParserRuleContext(parent, invokingState) { } -HogQLParser::SelectStmtContext* HogQLParser::SelectStmtWithParensContext::selectStmt() { - return getRuleContext(0); +HogQLParser::SelectStmtWithParensContext* HogQLParser::SubsequentSelectSetClauseContext::selectStmtWithParens() { + return getRuleContext(0); } -tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::LPAREN() { - return getToken(HogQLParser::LPAREN, 0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::EXCEPT() { + return getToken(HogQLParser::EXCEPT, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::SelectStmtWithParensContext::selectUnionStmt() { - return getRuleContext(0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::UNION() { + return getToken(HogQLParser::UNION, 0); } -tree::TerminalNode* HogQLParser::SelectStmtWithParensContext::RPAREN() { - return getToken(HogQLParser::RPAREN, 0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::ALL() { + return getToken(HogQLParser::ALL, 0); } -HogQLParser::PlaceholderContext* HogQLParser::SelectStmtWithParensContext::placeholder() { - return getRuleContext(0); +tree::TerminalNode* HogQLParser::SubsequentSelectSetClauseContext::INTERSECT() { + return getToken(HogQLParser::INTERSECT, 0); } -size_t HogQLParser::SelectStmtWithParensContext::getRuleIndex() const { - return HogQLParser::RuleSelectStmtWithParens; +size_t HogQLParser::SubsequentSelectSetClauseContext::getRuleIndex() const { + return HogQLParser::RuleSubsequentSelectSetClause; } -std::any HogQLParser::SelectStmtWithParensContext::accept(tree::ParseTreeVisitor *visitor) { +std::any HogQLParser::SubsequentSelectSetClauseContext::accept(tree::ParseTreeVisitor *visitor) { if (auto parserVisitor = dynamic_cast(visitor)) - return parserVisitor->visitSelectStmtWithParens(this); + return parserVisitor->visitSubsequentSelectSetClause(this); else return visitor->visitChildren(this); } -HogQLParser::SelectStmtWithParensContext* HogQLParser::selectStmtWithParens() { - SelectStmtWithParensContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 46, HogQLParser::RuleSelectStmtWithParens); +HogQLParser::SubsequentSelectSetClauseContext* HogQLParser::subsequentSelectSetClause() { + SubsequentSelectSetClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 46, HogQLParser::RuleSubsequentSelectSetClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -2872,38 +2888,105 @@ HogQLParser::SelectStmtWithParensContext* HogQLParser::selectStmtWithParens() { exitRule(); }); try { - setState(377); + enterOuterAlt(_localctx, 1); + setState(376); _errHandler->sync(this); switch (_input->LA(1)) { - case HogQLParser::SELECT: - case HogQLParser::WITH: { - enterOuterAlt(_localctx, 1); - setState(371); - selectStmt(); + case HogQLParser::EXCEPT: { + setState(372); + match(HogQLParser::EXCEPT); break; } - case HogQLParser::LPAREN: { - enterOuterAlt(_localctx, 2); - setState(372); - match(HogQLParser::LPAREN); + case HogQLParser::UNION: { setState(373); - selectUnionStmt(); + match(HogQLParser::UNION); setState(374); - match(HogQLParser::RPAREN); + match(HogQLParser::ALL); break; } - case HogQLParser::LBRACE: { - enterOuterAlt(_localctx, 3); - setState(376); - placeholder(); + case HogQLParser::INTERSECT: { + setState(375); + match(HogQLParser::INTERSECT); break; } default: throw NoViableAltException(this); } + setState(378); + selectStmtWithParens(); + + } + catch (RecognitionException &e) { + _errHandler->reportError(this, e); + _localctx->exception = std::current_exception(); + _errHandler->recover(this, _localctx->exception); + } + + return _localctx; +} + +//----------------- SelectSetStmtContext ------------------------------------------------------------------ + +HogQLParser::SelectSetStmtContext::SelectSetStmtContext(ParserRuleContext *parent, size_t invokingState) + : ParserRuleContext(parent, invokingState) { +} + +HogQLParser::SelectStmtWithParensContext* HogQLParser::SelectSetStmtContext::selectStmtWithParens() { + return getRuleContext(0); +} + +std::vector HogQLParser::SelectSetStmtContext::subsequentSelectSetClause() { + return getRuleContexts(); +} + +HogQLParser::SubsequentSelectSetClauseContext* HogQLParser::SelectSetStmtContext::subsequentSelectSetClause(size_t i) { + return getRuleContext(i); +} + + +size_t HogQLParser::SelectSetStmtContext::getRuleIndex() const { + return HogQLParser::RuleSelectSetStmt; +} + + +std::any HogQLParser::SelectSetStmtContext::accept(tree::ParseTreeVisitor *visitor) { + if (auto parserVisitor = dynamic_cast(visitor)) + return parserVisitor->visitSelectSetStmt(this); + else + return visitor->visitChildren(this); +} + +HogQLParser::SelectSetStmtContext* HogQLParser::selectSetStmt() { + SelectSetStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); + enterRule(_localctx, 48, HogQLParser::RuleSelectSetStmt); + size_t _la = 0; + +#if __cplusplus > 201703L + auto onExit = finally([=, this] { +#else + auto onExit = finally([=] { +#endif + exitRule(); + }); + try { + enterOuterAlt(_localctx, 1); + setState(380); + selectStmtWithParens(); + setState(384); + _errHandler->sync(this); + _la = _input->LA(1); + while (_la == HogQLParser::EXCEPT + + || _la == HogQLParser::INTERSECT || _la == HogQLParser::UNION) { + setState(381); + subsequentSelectSetClause(); + setState(386); + _errHandler->sync(this); + _la = _input->LA(1); + } } catch (RecognitionException &e) { @@ -3020,7 +3103,7 @@ std::any HogQLParser::SelectStmtContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { SelectStmtContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 48, HogQLParser::RuleSelectStmt); + enterRule(_localctx, 50, HogQLParser::RuleSelectStmt); size_t _la = 0; #if __cplusplus > 201703L @@ -3032,22 +3115,22 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { }); try { enterOuterAlt(_localctx, 1); - setState(380); + setState(388); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WITH) { - setState(379); + setState(387); antlrcpp::downCast(_localctx)->with = withClause(); } - setState(382); + setState(390); match(HogQLParser::SELECT); - setState(384); + setState(392); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 31, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 32, _ctx)) { case 1: { - setState(383); + setState(391); match(HogQLParser::DISTINCT); break; } @@ -3055,12 +3138,12 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(387); + setState(395); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 32, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 33, _ctx)) { case 1: { - setState(386); + setState(394); topClause(); break; } @@ -3068,57 +3151,57 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(389); + setState(397); antlrcpp::downCast(_localctx)->columns = columnExprList(); - setState(391); + setState(399); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::FROM) { - setState(390); + setState(398); antlrcpp::downCast(_localctx)->from = fromClause(); } - setState(394); + setState(402); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 4538783999459360) != 0)) { - setState(393); + ((1ULL << _la) & 18084767253659680) != 0)) { + setState(401); arrayJoinClause(); } - setState(397); + setState(405); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::PREWHERE) { - setState(396); + setState(404); prewhereClause(); } - setState(400); + setState(408); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WHERE) { - setState(399); + setState(407); antlrcpp::downCast(_localctx)->where = whereClause(); } - setState(403); + setState(411); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::GROUP) { - setState(402); + setState(410); groupByClause(); } - setState(407); + setState(415); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 38, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 39, _ctx)) { case 1: { - setState(405); + setState(413); match(HogQLParser::WITH); - setState(406); + setState(414); _la = _input->LA(1); if (!(_la == HogQLParser::CUBE @@ -3135,56 +3218,58 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(411); + setState(419); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WITH) { - setState(409); + setState(417); match(HogQLParser::WITH); - setState(410); + setState(418); match(HogQLParser::TOTALS); } - setState(414); + setState(422); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::HAVING) { - setState(413); + setState(421); havingClause(); } - setState(417); + setState(425); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WINDOW) { - setState(416); + setState(424); windowClause(); } - setState(420); + setState(428); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ORDER) { - setState(419); + setState(427); orderByClause(); } - setState(424); + setState(432); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LIMIT: { - setState(422); + setState(430); limitAndOffsetClause(); break; } case HogQLParser::OFFSET: { - setState(423); + setState(431); offsetOnlyClause(); break; } case HogQLParser::EOF: + case HogQLParser::EXCEPT: + case HogQLParser::INTERSECT: case HogQLParser::SETTINGS: case HogQLParser::UNION: case HogQLParser::RPAREN: { @@ -3194,12 +3279,12 @@ HogQLParser::SelectStmtContext* HogQLParser::selectStmt() { default: break; } - setState(427); + setState(435); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::SETTINGS) { - setState(426); + setState(434); settingsClause(); } @@ -3242,7 +3327,7 @@ std::any HogQLParser::WithClauseContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::WithClauseContext* HogQLParser::withClause() { WithClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 50, HogQLParser::RuleWithClause); + enterRule(_localctx, 52, HogQLParser::RuleWithClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3253,9 +3338,9 @@ HogQLParser::WithClauseContext* HogQLParser::withClause() { }); try { enterOuterAlt(_localctx, 1); - setState(429); + setState(437); match(HogQLParser::WITH); - setState(430); + setState(438); withExprList(); } @@ -3305,7 +3390,7 @@ std::any HogQLParser::TopClauseContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::TopClauseContext* HogQLParser::topClause() { TopClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 52, HogQLParser::RuleTopClause); + enterRule(_localctx, 54, HogQLParser::RuleTopClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3316,18 +3401,18 @@ HogQLParser::TopClauseContext* HogQLParser::topClause() { }); try { enterOuterAlt(_localctx, 1); - setState(432); + setState(440); match(HogQLParser::TOP); - setState(433); + setState(441); match(HogQLParser::DECIMAL_LITERAL); - setState(436); + setState(444); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 45, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 46, _ctx)) { case 1: { - setState(434); + setState(442); match(HogQLParser::WITH); - setState(435); + setState(443); match(HogQLParser::TIES); break; } @@ -3375,7 +3460,7 @@ std::any HogQLParser::FromClauseContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::FromClauseContext* HogQLParser::fromClause() { FromClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 54, HogQLParser::RuleFromClause); + enterRule(_localctx, 56, HogQLParser::RuleFromClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3386,9 +3471,9 @@ HogQLParser::FromClauseContext* HogQLParser::fromClause() { }); try { enterOuterAlt(_localctx, 1); - setState(438); + setState(446); match(HogQLParser::FROM); - setState(439); + setState(447); joinExpr(0); } @@ -3442,7 +3527,7 @@ std::any HogQLParser::ArrayJoinClauseContext::accept(tree::ParseTreeVisitor *vis HogQLParser::ArrayJoinClauseContext* HogQLParser::arrayJoinClause() { ArrayJoinClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 56, HogQLParser::RuleArrayJoinClause); + enterRule(_localctx, 58, HogQLParser::RuleArrayJoinClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3454,14 +3539,14 @@ HogQLParser::ArrayJoinClauseContext* HogQLParser::arrayJoinClause() { }); try { enterOuterAlt(_localctx, 1); - setState(442); + setState(450); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::INNER || _la == HogQLParser::LEFT) { - setState(441); + setState(449); _la = _input->LA(1); if (!(_la == HogQLParser::INNER @@ -3473,11 +3558,11 @@ HogQLParser::ArrayJoinClauseContext* HogQLParser::arrayJoinClause() { consume(); } } - setState(444); + setState(452); match(HogQLParser::ARRAY); - setState(445); + setState(453); match(HogQLParser::JOIN); - setState(446); + setState(454); columnExprList(); } @@ -3563,7 +3648,7 @@ std::any HogQLParser::WindowClauseContext::accept(tree::ParseTreeVisitor *visito HogQLParser::WindowClauseContext* HogQLParser::windowClause() { WindowClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 58, HogQLParser::RuleWindowClause); + enterRule(_localctx, 60, HogQLParser::RuleWindowClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3575,35 +3660,35 @@ HogQLParser::WindowClauseContext* HogQLParser::windowClause() { }); try { enterOuterAlt(_localctx, 1); - setState(448); + setState(456); match(HogQLParser::WINDOW); - setState(449); + setState(457); identifier(); - setState(450); + setState(458); match(HogQLParser::AS); - setState(451); + setState(459); match(HogQLParser::LPAREN); - setState(452); + setState(460); windowExpr(); - setState(453); + setState(461); match(HogQLParser::RPAREN); - setState(463); + setState(471); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::COMMA) { - setState(454); + setState(462); match(HogQLParser::COMMA); - setState(455); + setState(463); identifier(); - setState(456); + setState(464); match(HogQLParser::AS); - setState(457); + setState(465); match(HogQLParser::LPAREN); - setState(458); + setState(466); windowExpr(); - setState(459); + setState(467); match(HogQLParser::RPAREN); - setState(465); + setState(473); _errHandler->sync(this); _la = _input->LA(1); } @@ -3647,7 +3732,7 @@ std::any HogQLParser::PrewhereClauseContext::accept(tree::ParseTreeVisitor *visi HogQLParser::PrewhereClauseContext* HogQLParser::prewhereClause() { PrewhereClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 60, HogQLParser::RulePrewhereClause); + enterRule(_localctx, 62, HogQLParser::RulePrewhereClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3658,9 +3743,9 @@ HogQLParser::PrewhereClauseContext* HogQLParser::prewhereClause() { }); try { enterOuterAlt(_localctx, 1); - setState(466); + setState(474); match(HogQLParser::PREWHERE); - setState(467); + setState(475); columnExpr(0); } @@ -3702,7 +3787,7 @@ std::any HogQLParser::WhereClauseContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::WhereClauseContext* HogQLParser::whereClause() { WhereClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 62, HogQLParser::RuleWhereClause); + enterRule(_localctx, 64, HogQLParser::RuleWhereClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3713,9 +3798,9 @@ HogQLParser::WhereClauseContext* HogQLParser::whereClause() { }); try { enterOuterAlt(_localctx, 1); - setState(469); + setState(477); match(HogQLParser::WHERE); - setState(470); + setState(478); columnExpr(0); } @@ -3777,7 +3862,7 @@ std::any HogQLParser::GroupByClauseContext::accept(tree::ParseTreeVisitor *visit HogQLParser::GroupByClauseContext* HogQLParser::groupByClause() { GroupByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 64, HogQLParser::RuleGroupByClause); + enterRule(_localctx, 66, HogQLParser::RuleGroupByClause); size_t _la = 0; #if __cplusplus > 201703L @@ -3789,15 +3874,15 @@ HogQLParser::GroupByClauseContext* HogQLParser::groupByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(472); + setState(480); match(HogQLParser::GROUP); - setState(473); + setState(481); match(HogQLParser::BY); - setState(480); + setState(488); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 48, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 49, _ctx)) { case 1: { - setState(474); + setState(482); _la = _input->LA(1); if (!(_la == HogQLParser::CUBE @@ -3808,17 +3893,17 @@ HogQLParser::GroupByClauseContext* HogQLParser::groupByClause() { _errHandler->reportMatch(this); consume(); } - setState(475); + setState(483); match(HogQLParser::LPAREN); - setState(476); + setState(484); columnExprList(); - setState(477); + setState(485); match(HogQLParser::RPAREN); break; } case 2: { - setState(479); + setState(487); columnExprList(); break; } @@ -3866,7 +3951,7 @@ std::any HogQLParser::HavingClauseContext::accept(tree::ParseTreeVisitor *visito HogQLParser::HavingClauseContext* HogQLParser::havingClause() { HavingClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 66, HogQLParser::RuleHavingClause); + enterRule(_localctx, 68, HogQLParser::RuleHavingClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3877,9 +3962,9 @@ HogQLParser::HavingClauseContext* HogQLParser::havingClause() { }); try { enterOuterAlt(_localctx, 1); - setState(482); + setState(490); match(HogQLParser::HAVING); - setState(483); + setState(491); columnExpr(0); } @@ -3925,7 +4010,7 @@ std::any HogQLParser::OrderByClauseContext::accept(tree::ParseTreeVisitor *visit HogQLParser::OrderByClauseContext* HogQLParser::orderByClause() { OrderByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 68, HogQLParser::RuleOrderByClause); + enterRule(_localctx, 70, HogQLParser::RuleOrderByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3936,11 +4021,11 @@ HogQLParser::OrderByClauseContext* HogQLParser::orderByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(485); + setState(493); match(HogQLParser::ORDER); - setState(486); + setState(494); match(HogQLParser::BY); - setState(487); + setState(495); orderExprList(); } @@ -3986,7 +4071,7 @@ std::any HogQLParser::ProjectionOrderByClauseContext::accept(tree::ParseTreeVisi HogQLParser::ProjectionOrderByClauseContext* HogQLParser::projectionOrderByClause() { ProjectionOrderByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 70, HogQLParser::RuleProjectionOrderByClause); + enterRule(_localctx, 72, HogQLParser::RuleProjectionOrderByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -3997,11 +4082,11 @@ HogQLParser::ProjectionOrderByClauseContext* HogQLParser::projectionOrderByClaus }); try { enterOuterAlt(_localctx, 1); - setState(489); + setState(497); match(HogQLParser::ORDER); - setState(490); + setState(498); match(HogQLParser::BY); - setState(491); + setState(499); columnExprList(); } @@ -4071,7 +4156,7 @@ std::any HogQLParser::LimitAndOffsetClauseContext::accept(tree::ParseTreeVisitor HogQLParser::LimitAndOffsetClauseContext* HogQLParser::limitAndOffsetClause() { LimitAndOffsetClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 72, HogQLParser::RuleLimitAndOffsetClause); + enterRule(_localctx, 74, HogQLParser::RuleLimitAndOffsetClause); size_t _la = 0; #if __cplusplus > 201703L @@ -4082,45 +4167,47 @@ HogQLParser::LimitAndOffsetClauseContext* HogQLParser::limitAndOffsetClause() { exitRule(); }); try { - setState(522); + setState(530); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 53, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 54, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(493); + setState(501); match(HogQLParser::LIMIT); - setState(494); + setState(502); columnExpr(0); - setState(497); + setState(505); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(495); + setState(503); match(HogQLParser::COMMA); - setState(496); + setState(504); columnExpr(0); } - setState(503); + setState(511); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::WITH: { - setState(499); + setState(507); match(HogQLParser::WITH); - setState(500); + setState(508); match(HogQLParser::TIES); break; } case HogQLParser::BY: { - setState(501); + setState(509); match(HogQLParser::BY); - setState(502); + setState(510); columnExprList(); break; } case HogQLParser::EOF: + case HogQLParser::EXCEPT: + case HogQLParser::INTERSECT: case HogQLParser::SETTINGS: case HogQLParser::UNION: case HogQLParser::RPAREN: { @@ -4135,45 +4222,45 @@ HogQLParser::LimitAndOffsetClauseContext* HogQLParser::limitAndOffsetClause() { case 2: { enterOuterAlt(_localctx, 2); - setState(505); + setState(513); match(HogQLParser::LIMIT); - setState(506); + setState(514); columnExpr(0); - setState(509); + setState(517); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::WITH) { - setState(507); + setState(515); match(HogQLParser::WITH); - setState(508); + setState(516); match(HogQLParser::TIES); } - setState(511); + setState(519); match(HogQLParser::OFFSET); - setState(512); + setState(520); columnExpr(0); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(514); + setState(522); match(HogQLParser::LIMIT); - setState(515); + setState(523); columnExpr(0); - setState(516); + setState(524); match(HogQLParser::OFFSET); - setState(517); + setState(525); columnExpr(0); - setState(520); + setState(528); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::BY) { - setState(518); + setState(526); match(HogQLParser::BY); - setState(519); + setState(527); columnExprList(); } break; @@ -4222,7 +4309,7 @@ std::any HogQLParser::OffsetOnlyClauseContext::accept(tree::ParseTreeVisitor *vi HogQLParser::OffsetOnlyClauseContext* HogQLParser::offsetOnlyClause() { OffsetOnlyClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 74, HogQLParser::RuleOffsetOnlyClause); + enterRule(_localctx, 76, HogQLParser::RuleOffsetOnlyClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4233,9 +4320,9 @@ HogQLParser::OffsetOnlyClauseContext* HogQLParser::offsetOnlyClause() { }); try { enterOuterAlt(_localctx, 1); - setState(524); + setState(532); match(HogQLParser::OFFSET); - setState(525); + setState(533); columnExpr(0); } @@ -4277,7 +4364,7 @@ std::any HogQLParser::SettingsClauseContext::accept(tree::ParseTreeVisitor *visi HogQLParser::SettingsClauseContext* HogQLParser::settingsClause() { SettingsClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 76, HogQLParser::RuleSettingsClause); + enterRule(_localctx, 78, HogQLParser::RuleSettingsClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4288,9 +4375,9 @@ HogQLParser::SettingsClauseContext* HogQLParser::settingsClause() { }); try { enterOuterAlt(_localctx, 1); - setState(527); + setState(535); match(HogQLParser::SETTINGS); - setState(528); + setState(536); settingExprList(); } @@ -4429,8 +4516,8 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { HogQLParser::JoinExprContext *_localctx = _tracker.createInstance(_ctx, parentState); HogQLParser::JoinExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 78; - enterRecursionRule(_localctx, 78, HogQLParser::RuleJoinExpr, precedence); + size_t startState = 80; + enterRecursionRule(_localctx, 80, HogQLParser::RuleJoinExpr, precedence); size_t _la = 0; @@ -4444,22 +4531,22 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(542); + setState(550); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 56, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 57, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(531); + setState(539); tableExpr(0); - setState(533); + setState(541); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 54, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 55, _ctx)) { case 1: { - setState(532); + setState(540); match(HogQLParser::FINAL); break; } @@ -4467,12 +4554,12 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { default: break; } - setState(536); + setState(544); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 55, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 56, _ctx)) { case 1: { - setState(535); + setState(543); sampleClause(); break; } @@ -4487,11 +4574,11 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(538); + setState(546); match(HogQLParser::LPAREN); - setState(539); + setState(547); joinExpr(0); - setState(540); + setState(548); match(HogQLParser::RPAREN); break; } @@ -4500,27 +4587,27 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(558); + setState(566); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 60, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; - setState(556); + setState(564); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 58, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 59, _ctx)) { case 1: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleJoinExpr); - setState(544); + setState(552); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(545); + setState(553); joinOpCross(); - setState(546); + setState(554); joinExpr(4); break; } @@ -4529,25 +4616,25 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleJoinExpr); - setState(548); + setState(556); if (!(precpred(_ctx, 4))) throw FailedPredicateException(this, "precpred(_ctx, 4)"); - setState(550); + setState(558); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 4538818359197978) != 0) || _la == HogQLParser::RIGHT + ((1ULL << _la) & 18084835973136666) != 0) || _la == HogQLParser::RIGHT || _la == HogQLParser::SEMI) { - setState(549); + setState(557); joinOp(); } - setState(552); + setState(560); match(HogQLParser::JOIN); - setState(553); + setState(561); joinExpr(0); - setState(554); + setState(562); joinConstraintClause(); break; } @@ -4556,9 +4643,9 @@ HogQLParser::JoinExprContext* HogQLParser::joinExpr(int precedence) { break; } } - setState(560); + setState(568); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 59, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 60, _ctx); } } catch (RecognitionException &e) { @@ -4683,7 +4770,7 @@ std::any HogQLParser::JoinOpLeftRightContext::accept(tree::ParseTreeVisitor *vis } HogQLParser::JoinOpContext* HogQLParser::joinOp() { JoinOpContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 80, HogQLParser::RuleJoinOp); + enterRule(_localctx, 82, HogQLParser::RuleJoinOp); size_t _la = 0; #if __cplusplus > 201703L @@ -4694,23 +4781,23 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { exitRule(); }); try { - setState(604); + setState(612); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 73, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 74, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(570); + setState(578); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 62, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 63, _ctx)) { case 1: { - setState(562); + setState(570); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0)) { - setState(561); + setState(569); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0))) { @@ -4721,21 +4808,21 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { consume(); } } - setState(564); + setState(572); match(HogQLParser::INNER); break; } case 2: { - setState(565); + setState(573); match(HogQLParser::INNER); - setState(567); + setState(575); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0)) { - setState(566); + setState(574); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0))) { @@ -4750,7 +4837,7 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { } case 3: { - setState(569); + setState(577); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 274) != 0))) { @@ -4772,17 +4859,17 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(586); + setState(594); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 67, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 68, _ctx)) { case 1: { - setState(573); + setState(581); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI) { - setState(572); + setState(580); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI)) { @@ -4793,7 +4880,7 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { consume(); } } - setState(575); + setState(583); _la = _input->LA(1); if (!(_la == HogQLParser::LEFT @@ -4804,19 +4891,19 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { _errHandler->reportMatch(this); consume(); } - setState(577); + setState(585); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(576); + setState(584); match(HogQLParser::OUTER); } break; } case 2: { - setState(579); + setState(587); _la = _input->LA(1); if (!(_la == HogQLParser::LEFT @@ -4827,21 +4914,21 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { _errHandler->reportMatch(this); consume(); } - setState(581); + setState(589); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(580); + setState(588); match(HogQLParser::OUTER); } - setState(584); + setState(592); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI) { - setState(583); + setState(591); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 282) != 0) || _la == HogQLParser::SEMI)) { @@ -4864,18 +4951,18 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { case 3: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 3); - setState(602); + setState(610); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 72, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 73, _ctx)) { case 1: { - setState(589); + setState(597); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ALL || _la == HogQLParser::ANY) { - setState(588); + setState(596); _la = _input->LA(1); if (!(_la == HogQLParser::ALL @@ -4887,38 +4974,38 @@ HogQLParser::JoinOpContext* HogQLParser::joinOp() { consume(); } } - setState(591); + setState(599); match(HogQLParser::FULL); - setState(593); + setState(601); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(592); + setState(600); match(HogQLParser::OUTER); } break; } case 2: { - setState(595); + setState(603); match(HogQLParser::FULL); - setState(597); + setState(605); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::OUTER) { - setState(596); + setState(604); match(HogQLParser::OUTER); } - setState(600); + setState(608); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ALL || _la == HogQLParser::ANY) { - setState(599); + setState(607); _la = _input->LA(1); if (!(_la == HogQLParser::ALL @@ -4986,7 +5073,7 @@ std::any HogQLParser::JoinOpCrossContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::JoinOpCrossContext* HogQLParser::joinOpCross() { JoinOpCrossContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 82, HogQLParser::RuleJoinOpCross); + enterRule(_localctx, 84, HogQLParser::RuleJoinOpCross); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -4996,21 +5083,21 @@ HogQLParser::JoinOpCrossContext* HogQLParser::joinOpCross() { exitRule(); }); try { - setState(609); + setState(617); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::CROSS: { enterOuterAlt(_localctx, 1); - setState(606); + setState(614); match(HogQLParser::CROSS); - setState(607); + setState(615); match(HogQLParser::JOIN); break; } case HogQLParser::COMMA: { enterOuterAlt(_localctx, 2); - setState(608); + setState(616); match(HogQLParser::COMMA); break; } @@ -5070,7 +5157,7 @@ std::any HogQLParser::JoinConstraintClauseContext::accept(tree::ParseTreeVisitor HogQLParser::JoinConstraintClauseContext* HogQLParser::joinConstraintClause() { JoinConstraintClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 84, HogQLParser::RuleJoinConstraintClause); + enterRule(_localctx, 86, HogQLParser::RuleJoinConstraintClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5080,36 +5167,36 @@ HogQLParser::JoinConstraintClauseContext* HogQLParser::joinConstraintClause() { exitRule(); }); try { - setState(620); + setState(628); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 75, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 76, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(611); + setState(619); match(HogQLParser::ON); - setState(612); + setState(620); columnExprList(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(613); + setState(621); match(HogQLParser::USING); - setState(614); + setState(622); match(HogQLParser::LPAREN); - setState(615); + setState(623); columnExprList(); - setState(616); + setState(624); match(HogQLParser::RPAREN); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(618); + setState(626); match(HogQLParser::USING); - setState(619); + setState(627); columnExprList(); break; } @@ -5165,7 +5252,7 @@ std::any HogQLParser::SampleClauseContext::accept(tree::ParseTreeVisitor *visito HogQLParser::SampleClauseContext* HogQLParser::sampleClause() { SampleClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 86, HogQLParser::RuleSampleClause); + enterRule(_localctx, 88, HogQLParser::RuleSampleClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5176,18 +5263,18 @@ HogQLParser::SampleClauseContext* HogQLParser::sampleClause() { }); try { enterOuterAlt(_localctx, 1); - setState(622); + setState(630); match(HogQLParser::SAMPLE); - setState(623); + setState(631); ratioExpr(); - setState(626); + setState(634); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 76, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 77, _ctx)) { case 1: { - setState(624); + setState(632); match(HogQLParser::OFFSET); - setState(625); + setState(633); ratioExpr(); break; } @@ -5243,7 +5330,7 @@ std::any HogQLParser::OrderExprListContext::accept(tree::ParseTreeVisitor *visit HogQLParser::OrderExprListContext* HogQLParser::orderExprList() { OrderExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 88, HogQLParser::RuleOrderExprList); + enterRule(_localctx, 90, HogQLParser::RuleOrderExprList); size_t _la = 0; #if __cplusplus > 201703L @@ -5255,17 +5342,17 @@ HogQLParser::OrderExprListContext* HogQLParser::orderExprList() { }); try { enterOuterAlt(_localctx, 1); - setState(628); + setState(636); orderExpr(); - setState(633); + setState(641); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::COMMA) { - setState(629); + setState(637); match(HogQLParser::COMMA); - setState(630); + setState(638); orderExpr(); - setState(635); + setState(643); _errHandler->sync(this); _la = _input->LA(1); } @@ -5337,7 +5424,7 @@ std::any HogQLParser::OrderExprContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::OrderExprContext* HogQLParser::orderExpr() { OrderExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 90, HogQLParser::RuleOrderExpr); + enterRule(_localctx, 92, HogQLParser::RuleOrderExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -5349,15 +5436,15 @@ HogQLParser::OrderExprContext* HogQLParser::orderExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(636); + setState(644); columnExpr(0); - setState(638); + setState(646); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 12583040) != 0)) { - setState(637); + setState(645); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && ((1ULL << _la) & 12583040) != 0))) { @@ -5368,14 +5455,14 @@ HogQLParser::OrderExprContext* HogQLParser::orderExpr() { consume(); } } - setState(642); + setState(650); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NULLS) { - setState(640); + setState(648); match(HogQLParser::NULLS); - setState(641); + setState(649); _la = _input->LA(1); if (!(_la == HogQLParser::FIRST @@ -5387,14 +5474,14 @@ HogQLParser::OrderExprContext* HogQLParser::orderExpr() { consume(); } } - setState(646); + setState(654); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COLLATE) { - setState(644); + setState(652); match(HogQLParser::COLLATE); - setState(645); + setState(653); match(HogQLParser::STRING_LITERAL); } @@ -5445,7 +5532,7 @@ std::any HogQLParser::RatioExprContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::RatioExprContext* HogQLParser::ratioExpr() { RatioExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 92, HogQLParser::RuleRatioExpr); + enterRule(_localctx, 94, HogQLParser::RuleRatioExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5455,12 +5542,12 @@ HogQLParser::RatioExprContext* HogQLParser::ratioExpr() { exitRule(); }); try { - setState(654); + setState(662); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LBRACE: { enterOuterAlt(_localctx, 1); - setState(648); + setState(656); placeholder(); break; } @@ -5475,16 +5562,16 @@ HogQLParser::RatioExprContext* HogQLParser::ratioExpr() { case HogQLParser::DOT: case HogQLParser::PLUS: { enterOuterAlt(_localctx, 2); - setState(649); + setState(657); numberLiteral(); - setState(652); + setState(660); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 81, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 82, _ctx)) { case 1: { - setState(650); + setState(658); match(HogQLParser::SLASH); - setState(651); + setState(659); numberLiteral(); break; } @@ -5546,7 +5633,7 @@ std::any HogQLParser::SettingExprListContext::accept(tree::ParseTreeVisitor *vis HogQLParser::SettingExprListContext* HogQLParser::settingExprList() { SettingExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 94, HogQLParser::RuleSettingExprList); + enterRule(_localctx, 96, HogQLParser::RuleSettingExprList); size_t _la = 0; #if __cplusplus > 201703L @@ -5558,17 +5645,17 @@ HogQLParser::SettingExprListContext* HogQLParser::settingExprList() { }); try { enterOuterAlt(_localctx, 1); - setState(656); + setState(664); settingExpr(); - setState(661); + setState(669); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::COMMA) { - setState(657); + setState(665); match(HogQLParser::COMMA); - setState(658); + setState(666); settingExpr(); - setState(663); + setState(671); _errHandler->sync(this); _la = _input->LA(1); } @@ -5616,7 +5703,7 @@ std::any HogQLParser::SettingExprContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::SettingExprContext* HogQLParser::settingExpr() { SettingExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 96, HogQLParser::RuleSettingExpr); + enterRule(_localctx, 98, HogQLParser::RuleSettingExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5627,11 +5714,11 @@ HogQLParser::SettingExprContext* HogQLParser::settingExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(664); + setState(672); identifier(); - setState(665); + setState(673); match(HogQLParser::EQ_SINGLE); - setState(666); + setState(674); literal(); } @@ -5677,7 +5764,7 @@ std::any HogQLParser::WindowExprContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::WindowExprContext* HogQLParser::windowExpr() { WindowExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 98, HogQLParser::RuleWindowExpr); + enterRule(_localctx, 100, HogQLParser::RuleWindowExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -5689,30 +5776,30 @@ HogQLParser::WindowExprContext* HogQLParser::windowExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(669); + setState(677); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::PARTITION) { - setState(668); + setState(676); winPartitionByClause(); } - setState(672); + setState(680); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ORDER) { - setState(671); + setState(679); winOrderByClause(); } - setState(675); + setState(683); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::RANGE || _la == HogQLParser::ROWS) { - setState(674); + setState(682); winFrameClause(); } @@ -5759,7 +5846,7 @@ std::any HogQLParser::WinPartitionByClauseContext::accept(tree::ParseTreeVisitor HogQLParser::WinPartitionByClauseContext* HogQLParser::winPartitionByClause() { WinPartitionByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 100, HogQLParser::RuleWinPartitionByClause); + enterRule(_localctx, 102, HogQLParser::RuleWinPartitionByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5770,11 +5857,11 @@ HogQLParser::WinPartitionByClauseContext* HogQLParser::winPartitionByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(677); + setState(685); match(HogQLParser::PARTITION); - setState(678); + setState(686); match(HogQLParser::BY); - setState(679); + setState(687); columnExprList(); } @@ -5820,7 +5907,7 @@ std::any HogQLParser::WinOrderByClauseContext::accept(tree::ParseTreeVisitor *vi HogQLParser::WinOrderByClauseContext* HogQLParser::winOrderByClause() { WinOrderByClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 102, HogQLParser::RuleWinOrderByClause); + enterRule(_localctx, 104, HogQLParser::RuleWinOrderByClause); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5831,11 +5918,11 @@ HogQLParser::WinOrderByClauseContext* HogQLParser::winOrderByClause() { }); try { enterOuterAlt(_localctx, 1); - setState(681); + setState(689); match(HogQLParser::ORDER); - setState(682); + setState(690); match(HogQLParser::BY); - setState(683); + setState(691); orderExprList(); } @@ -5881,7 +5968,7 @@ std::any HogQLParser::WinFrameClauseContext::accept(tree::ParseTreeVisitor *visi HogQLParser::WinFrameClauseContext* HogQLParser::winFrameClause() { WinFrameClauseContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 104, HogQLParser::RuleWinFrameClause); + enterRule(_localctx, 106, HogQLParser::RuleWinFrameClause); size_t _la = 0; #if __cplusplus > 201703L @@ -5893,7 +5980,7 @@ HogQLParser::WinFrameClauseContext* HogQLParser::winFrameClause() { }); try { enterOuterAlt(_localctx, 1); - setState(685); + setState(693); _la = _input->LA(1); if (!(_la == HogQLParser::RANGE @@ -5904,7 +5991,7 @@ HogQLParser::WinFrameClauseContext* HogQLParser::winFrameClause() { _errHandler->reportMatch(this); consume(); } - setState(686); + setState(694); winFrameExtend(); } @@ -5976,7 +6063,7 @@ std::any HogQLParser::FrameBetweenContext::accept(tree::ParseTreeVisitor *visito } HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { WinFrameExtendContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 106, HogQLParser::RuleWinFrameExtend); + enterRule(_localctx, 108, HogQLParser::RuleWinFrameExtend); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -5986,7 +6073,7 @@ HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { exitRule(); }); try { - setState(694); + setState(702); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::CURRENT: @@ -6002,7 +6089,7 @@ HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { case HogQLParser::PLUS: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(688); + setState(696); winFrameBound(); break; } @@ -6010,13 +6097,13 @@ HogQLParser::WinFrameExtendContext* HogQLParser::winFrameExtend() { case HogQLParser::BETWEEN: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(689); + setState(697); match(HogQLParser::BETWEEN); - setState(690); + setState(698); winFrameBound(); - setState(691); + setState(699); match(HogQLParser::AND); - setState(692); + setState(700); winFrameBound(); break; } @@ -6080,7 +6167,7 @@ std::any HogQLParser::WinFrameBoundContext::accept(tree::ParseTreeVisitor *visit HogQLParser::WinFrameBoundContext* HogQLParser::winFrameBound() { WinFrameBoundContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 108, HogQLParser::RuleWinFrameBound); + enterRule(_localctx, 110, HogQLParser::RuleWinFrameBound); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6091,45 +6178,45 @@ HogQLParser::WinFrameBoundContext* HogQLParser::winFrameBound() { }); try { enterOuterAlt(_localctx, 1); - setState(708); + setState(716); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 88, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 89, _ctx)) { case 1: { - setState(696); + setState(704); match(HogQLParser::CURRENT); - setState(697); + setState(705); match(HogQLParser::ROW); break; } case 2: { - setState(698); + setState(706); match(HogQLParser::UNBOUNDED); - setState(699); + setState(707); match(HogQLParser::PRECEDING); break; } case 3: { - setState(700); + setState(708); match(HogQLParser::UNBOUNDED); - setState(701); + setState(709); match(HogQLParser::FOLLOWING); break; } case 4: { - setState(702); + setState(710); numberLiteral(); - setState(703); + setState(711); match(HogQLParser::PRECEDING); break; } case 5: { - setState(705); + setState(713); numberLiteral(); - setState(706); + setState(714); match(HogQLParser::FOLLOWING); break; } @@ -6177,7 +6264,7 @@ std::any HogQLParser::ExprContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::ExprContext* HogQLParser::expr() { ExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 110, HogQLParser::RuleExpr); + enterRule(_localctx, 112, HogQLParser::RuleExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6188,9 +6275,9 @@ HogQLParser::ExprContext* HogQLParser::expr() { }); try { enterOuterAlt(_localctx, 1); - setState(710); + setState(718); columnExpr(0); - setState(711); + setState(719); match(HogQLParser::EOF); } @@ -6383,7 +6470,7 @@ std::any HogQLParser::ColumnTypeExprEnumContext::accept(tree::ParseTreeVisitor * } HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { ColumnTypeExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 112, HogQLParser::RuleColumnTypeExpr); + enterRule(_localctx, 114, HogQLParser::RuleColumnTypeExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -6395,13 +6482,13 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { }); try { size_t alt; - setState(769); + setState(777); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 96, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 97, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(713); + setState(721); identifier(); break; } @@ -6409,39 +6496,39 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(714); + setState(722); identifier(); - setState(715); + setState(723); match(HogQLParser::LPAREN); - setState(716); + setState(724); identifier(); - setState(717); + setState(725); columnTypeExpr(); - setState(724); + setState(732); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 89, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 90, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(718); + setState(726); match(HogQLParser::COMMA); - setState(719); + setState(727); identifier(); - setState(720); + setState(728); columnTypeExpr(); } - setState(726); + setState(734); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 89, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 90, _ctx); } - setState(728); + setState(736); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(727); + setState(735); match(HogQLParser::COMMA); } - setState(730); + setState(738); match(HogQLParser::RPAREN); break; } @@ -6449,35 +6536,35 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 3: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 3); - setState(732); + setState(740); identifier(); - setState(733); + setState(741); match(HogQLParser::LPAREN); - setState(734); + setState(742); enumValue(); - setState(739); + setState(747); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 91, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 92, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(735); + setState(743); match(HogQLParser::COMMA); - setState(736); + setState(744); enumValue(); } - setState(741); + setState(749); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 91, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 92, _ctx); } - setState(743); + setState(751); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(742); + setState(750); match(HogQLParser::COMMA); } - setState(745); + setState(753); match(HogQLParser::RPAREN); break; } @@ -6485,35 +6572,35 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 4: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 4); - setState(747); + setState(755); identifier(); - setState(748); + setState(756); match(HogQLParser::LPAREN); - setState(749); + setState(757); columnTypeExpr(); - setState(754); + setState(762); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 93, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(750); + setState(758); match(HogQLParser::COMMA); - setState(751); + setState(759); columnTypeExpr(); } - setState(756); + setState(764); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 93, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 94, _ctx); } - setState(758); + setState(766); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(757); + setState(765); match(HogQLParser::COMMA); } - setState(760); + setState(768); match(HogQLParser::RPAREN); break; } @@ -6521,22 +6608,22 @@ HogQLParser::ColumnTypeExprContext* HogQLParser::columnTypeExpr() { case 5: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 5); - setState(762); + setState(770); identifier(); - setState(763); + setState(771); match(HogQLParser::LPAREN); - setState(765); + setState(773); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(764); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(772); columnExprList(); } - setState(767); + setState(775); match(HogQLParser::RPAREN); break; } @@ -6592,7 +6679,7 @@ std::any HogQLParser::ColumnExprListContext::accept(tree::ParseTreeVisitor *visi HogQLParser::ColumnExprListContext* HogQLParser::columnExprList() { ColumnExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 114, HogQLParser::RuleColumnExprList); + enterRule(_localctx, 116, HogQLParser::RuleColumnExprList); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -6604,28 +6691,28 @@ HogQLParser::ColumnExprListContext* HogQLParser::columnExprList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(771); + setState(779); columnExpr(0); - setState(776); + setState(784); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 97, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 98, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(772); + setState(780); match(HogQLParser::COMMA); - setState(773); + setState(781); columnExpr(0); } - setState(778); + setState(786); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 97, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 98, _ctx); } - setState(780); + setState(788); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 98, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 99, _ctx)) { case 1: { - setState(779); + setState(787); match(HogQLParser::COMMA); break; } @@ -6761,8 +6848,8 @@ tree::TerminalNode* HogQLParser::ColumnExprSubqueryContext::LPAREN() { return getToken(HogQLParser::LPAREN, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::ColumnExprSubqueryContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::ColumnExprSubqueryContext::selectSetStmt() { + return getRuleContext(0); } tree::TerminalNode* HogQLParser::ColumnExprSubqueryContext::RPAREN() { @@ -7806,8 +7893,8 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { HogQLParser::ColumnExprContext *_localctx = _tracker.createInstance(_ctx, parentState); HogQLParser::ColumnExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 116; - enterRecursionRule(_localctx, 116, HogQLParser::RuleColumnExpr, precedence); + size_t startState = 118; + enterRecursionRule(_localctx, 118, HogQLParser::RuleColumnExpr, precedence); size_t _la = 0; @@ -7821,22 +7908,22 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(932); + setState(940); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 118, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 119, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(783); + setState(791); match(HogQLParser::CASE); - setState(785); + setState(793); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 99, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 100, _ctx)) { case 1: { - setState(784); + setState(792); antlrcpp::downCast(_localctx)->caseExpr = columnExpr(0); break; } @@ -7844,33 +7931,33 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(792); + setState(800); _errHandler->sync(this); _la = _input->LA(1); do { - setState(787); + setState(795); match(HogQLParser::WHEN); - setState(788); + setState(796); antlrcpp::downCast(_localctx)->whenExpr = columnExpr(0); - setState(789); + setState(797); match(HogQLParser::THEN); - setState(790); + setState(798); antlrcpp::downCast(_localctx)->thenExpr = columnExpr(0); - setState(794); + setState(802); _errHandler->sync(this); _la = _input->LA(1); } while (_la == HogQLParser::WHEN); - setState(798); + setState(806); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::ELSE) { - setState(796); + setState(804); match(HogQLParser::ELSE); - setState(797); + setState(805); antlrcpp::downCast(_localctx)->elseExpr = columnExpr(0); } - setState(800); + setState(808); match(HogQLParser::END); break; } @@ -7879,17 +7966,17 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(802); + setState(810); match(HogQLParser::CAST); - setState(803); + setState(811); match(HogQLParser::LPAREN); - setState(804); + setState(812); columnExpr(0); - setState(805); + setState(813); match(HogQLParser::AS); - setState(806); + setState(814); columnTypeExpr(); - setState(807); + setState(815); match(HogQLParser::RPAREN); break; } @@ -7898,9 +7985,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(809); + setState(817); match(HogQLParser::DATE); - setState(810); + setState(818); match(HogQLParser::STRING_LITERAL); break; } @@ -7909,11 +7996,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(811); + setState(819); match(HogQLParser::INTERVAL); - setState(812); + setState(820); columnExpr(0); - setState(813); + setState(821); interval(); break; } @@ -7922,27 +8009,27 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(815); + setState(823); match(HogQLParser::SUBSTRING); - setState(816); + setState(824); match(HogQLParser::LPAREN); - setState(817); + setState(825); columnExpr(0); - setState(818); + setState(826); match(HogQLParser::FROM); - setState(819); + setState(827); columnExpr(0); - setState(822); + setState(830); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::FOR) { - setState(820); + setState(828); match(HogQLParser::FOR); - setState(821); + setState(829); columnExpr(0); } - setState(824); + setState(832); match(HogQLParser::RPAREN); break; } @@ -7951,9 +8038,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(826); + setState(834); match(HogQLParser::TIMESTAMP); - setState(827); + setState(835); match(HogQLParser::STRING_LITERAL); break; } @@ -7962,11 +8049,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(828); + setState(836); match(HogQLParser::TRIM); - setState(829); + setState(837); match(HogQLParser::LPAREN); - setState(830); + setState(838); _la = _input->LA(1); if (!(_la == HogQLParser::BOTH @@ -7977,13 +8064,13 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _errHandler->reportMatch(this); consume(); } - setState(831); + setState(839); string(); - setState(832); + setState(840); match(HogQLParser::FROM); - setState(833); + setState(841); columnExpr(0); - setState(834); + setState(842); match(HogQLParser::RPAREN); break; } @@ -7992,37 +8079,37 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(836); + setState(844); identifier(); - setState(837); + setState(845); match(HogQLParser::LPAREN); - setState(839); + setState(847); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(838); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(846); antlrcpp::downCast(_localctx)->columnExprs = columnExprList(); } - setState(841); + setState(849); match(HogQLParser::RPAREN); - setState(851); + setState(859); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::LPAREN) { - setState(843); + setState(851); match(HogQLParser::LPAREN); - setState(845); + setState(853); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 104, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 105, _ctx)) { case 1: { - setState(844); + setState(852); match(HogQLParser::DISTINCT); break; } @@ -8030,27 +8117,27 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(848); + setState(856); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(847); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(855); antlrcpp::downCast(_localctx)->columnArgList = columnExprList(); } - setState(850); + setState(858); match(HogQLParser::RPAREN); } - setState(853); + setState(861); match(HogQLParser::OVER); - setState(854); + setState(862); match(HogQLParser::LPAREN); - setState(855); + setState(863); windowExpr(); - setState(856); + setState(864); match(HogQLParser::RPAREN); break; } @@ -8059,37 +8146,37 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(858); + setState(866); identifier(); - setState(859); + setState(867); match(HogQLParser::LPAREN); - setState(861); + setState(869); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(860); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(868); antlrcpp::downCast(_localctx)->columnExprs = columnExprList(); } - setState(863); + setState(871); match(HogQLParser::RPAREN); - setState(873); + setState(881); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::LPAREN) { - setState(865); + setState(873); match(HogQLParser::LPAREN); - setState(867); + setState(875); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 108, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 109, _ctx)) { case 1: { - setState(866); + setState(874); match(HogQLParser::DISTINCT); break; } @@ -8097,23 +8184,23 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(870); + setState(878); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(869); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(877); antlrcpp::downCast(_localctx)->columnArgList = columnExprList(); } - setState(872); + setState(880); match(HogQLParser::RPAREN); } - setState(875); + setState(883); match(HogQLParser::OVER); - setState(876); + setState(884); identifier(); break; } @@ -8122,27 +8209,27 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(878); + setState(886); identifier(); - setState(884); + setState(892); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 112, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 113, _ctx)) { case 1: { - setState(879); + setState(887); match(HogQLParser::LPAREN); - setState(881); + setState(889); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(880); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(888); antlrcpp::downCast(_localctx)->columnExprs = columnExprList(); } - setState(883); + setState(891); match(HogQLParser::RPAREN); break; } @@ -8150,14 +8237,14 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(886); + setState(894); match(HogQLParser::LPAREN); - setState(888); + setState(896); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 113, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 114, _ctx)) { case 1: { - setState(887); + setState(895); match(HogQLParser::DISTINCT); break; } @@ -8165,18 +8252,18 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(891); + setState(899); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(890); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(898); antlrcpp::downCast(_localctx)->columnArgList = columnExprList(); } - setState(893); + setState(901); match(HogQLParser::RPAREN); break; } @@ -8185,7 +8272,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(895); + setState(903); hogqlxTagElement(); break; } @@ -8194,7 +8281,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(896); + setState(904); templateString(); break; } @@ -8203,7 +8290,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(897); + setState(905); literal(); break; } @@ -8212,9 +8299,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(898); + setState(906); match(HogQLParser::DASH); - setState(899); + setState(907); columnExpr(20); break; } @@ -8223,9 +8310,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(900); + setState(908); match(HogQLParser::NOT); - setState(901); + setState(909); columnExpr(14); break; } @@ -8234,19 +8321,19 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(905); + setState(913); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(902); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(910); tableIdentifier(); - setState(903); + setState(911); match(HogQLParser::DOT); } - setState(907); + setState(915); match(HogQLParser::ASTERISK); break; } @@ -8255,11 +8342,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(908); + setState(916); match(HogQLParser::LPAREN); - setState(909); - selectUnionStmt(); - setState(910); + setState(917); + selectSetStmt(); + setState(918); match(HogQLParser::RPAREN); break; } @@ -8268,11 +8355,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(912); + setState(920); match(HogQLParser::LPAREN); - setState(913); + setState(921); columnExpr(0); - setState(914); + setState(922); match(HogQLParser::RPAREN); break; } @@ -8281,11 +8368,11 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(916); + setState(924); match(HogQLParser::LPAREN); - setState(917); + setState(925); columnExprList(); - setState(918); + setState(926); match(HogQLParser::RPAREN); break; } @@ -8294,20 +8381,20 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(920); + setState(928); match(HogQLParser::LBRACKET); - setState(922); + setState(930); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(921); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(929); columnExprList(); } - setState(924); + setState(932); match(HogQLParser::RBRACKET); break; } @@ -8316,20 +8403,20 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(925); + setState(933); match(HogQLParser::LBRACE); - setState(927); + setState(935); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(926); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(934); kvPairList(); } - setState(929); + setState(937); match(HogQLParser::RBRACE); break; } @@ -8338,7 +8425,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(930); + setState(938); columnLambdaExpr(); break; } @@ -8347,7 +8434,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(931); + setState(939); columnIdentifier(); break; } @@ -8356,42 +8443,42 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(1044); + setState(1052); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 130, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) triggerExitRuleEvent(); previousContext = _localctx; - setState(1042); + setState(1050); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 129, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 130, _ctx)) { case 1: { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; newContext->left = previousContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(934); + setState(942); if (!(precpred(_ctx, 19))) throw FailedPredicateException(this, "precpred(_ctx, 19)"); - setState(938); + setState(946); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::ASTERISK: { - setState(935); + setState(943); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::ASTERISK); break; } case HogQLParser::SLASH: { - setState(936); + setState(944); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::SLASH); break; } case HogQLParser::PERCENT: { - setState(937); + setState(945); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::PERCENT); break; } @@ -8399,7 +8486,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: throw NoViableAltException(this); } - setState(940); + setState(948); antlrcpp::downCast(_localctx)->right = columnExpr(20); break; } @@ -8409,26 +8496,26 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = newContext; newContext->left = previousContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(941); + setState(949); if (!(precpred(_ctx, 18))) throw FailedPredicateException(this, "precpred(_ctx, 18)"); - setState(945); + setState(953); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::PLUS: { - setState(942); + setState(950); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::PLUS); break; } case HogQLParser::DASH: { - setState(943); + setState(951); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::DASH); break; } case HogQLParser::CONCAT: { - setState(944); + setState(952); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::CONCAT); break; } @@ -8436,7 +8523,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: throw NoViableAltException(this); } - setState(947); + setState(955); antlrcpp::downCast(_localctx)->right = columnExpr(19); break; } @@ -8446,71 +8533,71 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { _localctx = newContext; newContext->left = previousContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(948); + setState(956); if (!(precpred(_ctx, 17))) throw FailedPredicateException(this, "precpred(_ctx, 17)"); - setState(973); + setState(981); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 124, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 125, _ctx)) { case 1: { - setState(949); + setState(957); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::EQ_DOUBLE); break; } case 2: { - setState(950); + setState(958); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::EQ_SINGLE); break; } case 3: { - setState(951); + setState(959); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT_EQ); break; } case 4: { - setState(952); + setState(960); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::LT_EQ); break; } case 5: { - setState(953); + setState(961); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::LT); break; } case 6: { - setState(954); + setState(962); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::GT_EQ); break; } case 7: { - setState(955); + setState(963); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::GT); break; } case 8: { - setState(957); + setState(965); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(956); + setState(964); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT); } - setState(959); + setState(967); match(HogQLParser::IN); - setState(961); + setState(969); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 122, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 123, _ctx)) { case 1: { - setState(960); + setState(968); match(HogQLParser::COHORT); break; } @@ -8522,15 +8609,15 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { } case 9: { - setState(964); + setState(972); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(963); + setState(971); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT); } - setState(966); + setState(974); _la = _input->LA(1); if (!(_la == HogQLParser::ILIKE @@ -8545,37 +8632,37 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { } case 10: { - setState(967); + setState(975); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::REGEX_SINGLE); break; } case 11: { - setState(968); + setState(976); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::REGEX_DOUBLE); break; } case 12: { - setState(969); + setState(977); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT_REGEX); break; } case 13: { - setState(970); + setState(978); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::IREGEX_SINGLE); break; } case 14: { - setState(971); + setState(979); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::IREGEX_DOUBLE); break; } case 15: { - setState(972); + setState(980); antlrcpp::downCast(_localctx)->operator_ = match(HogQLParser::NOT_IREGEX); break; } @@ -8583,7 +8670,7 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { default: break; } - setState(975); + setState(983); antlrcpp::downCast(_localctx)->right = columnExpr(18); break; } @@ -8592,12 +8679,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(976); + setState(984); if (!(precpred(_ctx, 15))) throw FailedPredicateException(this, "precpred(_ctx, 15)"); - setState(977); + setState(985); match(HogQLParser::NULLISH); - setState(978); + setState(986); columnExpr(16); break; } @@ -8606,12 +8693,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(979); + setState(987); if (!(precpred(_ctx, 13))) throw FailedPredicateException(this, "precpred(_ctx, 13)"); - setState(980); + setState(988); match(HogQLParser::AND); - setState(981); + setState(989); columnExpr(14); break; } @@ -8620,12 +8707,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(982); + setState(990); if (!(precpred(_ctx, 12))) throw FailedPredicateException(this, "precpred(_ctx, 12)"); - setState(983); + setState(991); match(HogQLParser::OR); - setState(984); + setState(992); columnExpr(13); break; } @@ -8634,24 +8721,24 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(985); + setState(993); if (!(precpred(_ctx, 11))) throw FailedPredicateException(this, "precpred(_ctx, 11)"); - setState(987); + setState(995); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(986); + setState(994); match(HogQLParser::NOT); } - setState(989); + setState(997); match(HogQLParser::BETWEEN); - setState(990); + setState(998); columnExpr(0); - setState(991); + setState(999); match(HogQLParser::AND); - setState(992); + setState(1000); columnExpr(12); break; } @@ -8660,16 +8747,16 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(994); + setState(1002); if (!(precpred(_ctx, 10))) throw FailedPredicateException(this, "precpred(_ctx, 10)"); - setState(995); + setState(1003); match(HogQLParser::QUERY); - setState(996); + setState(1004); columnExpr(0); - setState(997); + setState(1005); match(HogQLParser::COLON); - setState(998); + setState(1006); columnExpr(10); break; } @@ -8678,23 +8765,23 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1000); + setState(1008); if (!(precpred(_ctx, 30))) throw FailedPredicateException(this, "precpred(_ctx, 30)"); - setState(1001); + setState(1009); match(HogQLParser::LPAREN); - setState(1003); + setState(1011); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(1002); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(1010); columnExprList(); } - setState(1005); + setState(1013); match(HogQLParser::RPAREN); break; } @@ -8703,14 +8790,14 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1006); + setState(1014); if (!(precpred(_ctx, 26))) throw FailedPredicateException(this, "precpred(_ctx, 26)"); - setState(1007); + setState(1015); match(HogQLParser::LBRACKET); - setState(1008); + setState(1016); columnExpr(0); - setState(1009); + setState(1017); match(HogQLParser::RBRACKET); break; } @@ -8719,12 +8806,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1011); + setState(1019); if (!(precpred(_ctx, 25))) throw FailedPredicateException(this, "precpred(_ctx, 25)"); - setState(1012); + setState(1020); match(HogQLParser::DOT); - setState(1013); + setState(1021); match(HogQLParser::DECIMAL_LITERAL); break; } @@ -8733,12 +8820,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1014); + setState(1022); if (!(precpred(_ctx, 24))) throw FailedPredicateException(this, "precpred(_ctx, 24)"); - setState(1015); + setState(1023); match(HogQLParser::DOT); - setState(1016); + setState(1024); identifier(); break; } @@ -8747,16 +8834,16 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1017); + setState(1025); if (!(precpred(_ctx, 23))) throw FailedPredicateException(this, "precpred(_ctx, 23)"); - setState(1018); + setState(1026); match(HogQLParser::NULL_PROPERTY); - setState(1019); + setState(1027); match(HogQLParser::LBRACKET); - setState(1020); + setState(1028); columnExpr(0); - setState(1021); + setState(1029); match(HogQLParser::RBRACKET); break; } @@ -8765,12 +8852,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1023); + setState(1031); if (!(precpred(_ctx, 22))) throw FailedPredicateException(this, "precpred(_ctx, 22)"); - setState(1024); + setState(1032); match(HogQLParser::NULL_PROPERTY); - setState(1025); + setState(1033); match(HogQLParser::DECIMAL_LITERAL); break; } @@ -8779,12 +8866,12 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1026); + setState(1034); if (!(precpred(_ctx, 21))) throw FailedPredicateException(this, "precpred(_ctx, 21)"); - setState(1027); + setState(1035); match(HogQLParser::NULL_PROPERTY); - setState(1028); + setState(1036); identifier(); break; } @@ -8793,20 +8880,20 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1029); + setState(1037); if (!(precpred(_ctx, 16))) throw FailedPredicateException(this, "precpred(_ctx, 16)"); - setState(1030); + setState(1038); match(HogQLParser::IS); - setState(1032); + setState(1040); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::NOT) { - setState(1031); + setState(1039); match(HogQLParser::NOT); } - setState(1034); + setState(1042); match(HogQLParser::NULL_SQL); break; } @@ -8815,24 +8902,24 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleColumnExpr); - setState(1035); + setState(1043); if (!(precpred(_ctx, 9))) throw FailedPredicateException(this, "precpred(_ctx, 9)"); - setState(1040); + setState(1048); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 128, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 129, _ctx)) { case 1: { - setState(1036); + setState(1044); match(HogQLParser::AS); - setState(1037); + setState(1045); identifier(); break; } case 2: { - setState(1038); + setState(1046); match(HogQLParser::AS); - setState(1039); + setState(1047); match(HogQLParser::STRING_LITERAL); break; } @@ -8847,9 +8934,9 @@ HogQLParser::ColumnExprContext* HogQLParser::columnExpr(int precedence) { break; } } - setState(1046); + setState(1054); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 130, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); } } catch (RecognitionException &e) { @@ -8917,7 +9004,7 @@ std::any HogQLParser::ColumnLambdaExprContext::accept(tree::ParseTreeVisitor *vi HogQLParser::ColumnLambdaExprContext* HogQLParser::columnLambdaExpr() { ColumnLambdaExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 118, HogQLParser::RuleColumnLambdaExpr); + enterRule(_localctx, 120, HogQLParser::RuleColumnLambdaExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -8930,73 +9017,73 @@ HogQLParser::ColumnLambdaExprContext* HogQLParser::columnLambdaExpr() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1074); + setState(1082); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 135, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { case 1: { - setState(1047); + setState(1055); match(HogQLParser::LPAREN); - setState(1048); + setState(1056); identifier(); - setState(1053); + setState(1061); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 132, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1049); + setState(1057); match(HogQLParser::COMMA); - setState(1050); + setState(1058); identifier(); } - setState(1055); + setState(1063); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 131, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 132, _ctx); } - setState(1057); + setState(1065); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1056); + setState(1064); match(HogQLParser::COMMA); } - setState(1059); + setState(1067); match(HogQLParser::RPAREN); break; } case 2: { - setState(1061); + setState(1069); identifier(); - setState(1066); + setState(1074); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 133, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 134, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1062); + setState(1070); match(HogQLParser::COMMA); - setState(1063); + setState(1071); identifier(); } - setState(1068); + setState(1076); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 133, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 134, _ctx); } - setState(1070); + setState(1078); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1069); + setState(1077); match(HogQLParser::COMMA); } break; } case 3: { - setState(1072); + setState(1080); match(HogQLParser::LPAREN); - setState(1073); + setState(1081); match(HogQLParser::RPAREN); break; } @@ -9004,19 +9091,19 @@ HogQLParser::ColumnLambdaExprContext* HogQLParser::columnLambdaExpr() { default: break; } - setState(1076); + setState(1084); match(HogQLParser::ARROW); - setState(1079); + setState(1087); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 136, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 137, _ctx)) { case 1: { - setState(1077); + setState(1085); columnExpr(0); break; } case 2: { - setState(1078); + setState(1086); block(); break; } @@ -9150,7 +9237,7 @@ std::any HogQLParser::HogqlxTagElementNestedContext::accept(tree::ParseTreeVisit } HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { HogqlxTagElementContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 120, HogQLParser::RuleHogqlxTagElement); + enterRule(_localctx, 122, HogQLParser::RuleHogqlxTagElement); size_t _la = 0; #if __cplusplus > 201703L @@ -9161,31 +9248,31 @@ HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { exitRule(); }); try { - setState(1113); + setState(1121); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 140, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 141, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(1081); + setState(1089); match(HogQLParser::LT); - setState(1082); + setState(1090); identifier(); - setState(1086); + setState(1094); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(1083); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(1091); hogqlxTagAttribute(); - setState(1088); + setState(1096); _errHandler->sync(this); _la = _input->LA(1); } - setState(1089); + setState(1097); match(HogQLParser::SLASH); - setState(1090); + setState(1098); match(HogQLParser::GT); break; } @@ -9193,40 +9280,40 @@ HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(1092); + setState(1100); match(HogQLParser::LT); - setState(1093); + setState(1101); identifier(); - setState(1097); + setState(1105); _errHandler->sync(this); _la = _input->LA(1); while ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1450176743603191810) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 6458554974207) != 0)) { - setState(1094); + ((1ULL << _la) & -5800812384855539714) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 25834219896831) != 0)) { + setState(1102); hogqlxTagAttribute(); - setState(1099); + setState(1107); _errHandler->sync(this); _la = _input->LA(1); } - setState(1100); + setState(1108); match(HogQLParser::GT); - setState(1106); + setState(1114); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 139, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 140, _ctx)) { case 1: { - setState(1101); + setState(1109); hogqlxTagElement(); break; } case 2: { - setState(1102); + setState(1110); match(HogQLParser::LBRACE); - setState(1103); + setState(1111); columnExpr(0); - setState(1104); + setState(1112); match(HogQLParser::RBRACE); break; } @@ -9234,13 +9321,13 @@ HogQLParser::HogqlxTagElementContext* HogQLParser::hogqlxTagElement() { default: break; } - setState(1108); + setState(1116); match(HogQLParser::LT); - setState(1109); + setState(1117); match(HogQLParser::SLASH); - setState(1110); + setState(1118); identifier(); - setState(1111); + setState(1119); match(HogQLParser::GT); break; } @@ -9304,7 +9391,7 @@ std::any HogQLParser::HogqlxTagAttributeContext::accept(tree::ParseTreeVisitor * HogQLParser::HogqlxTagAttributeContext* HogQLParser::hogqlxTagAttribute() { HogqlxTagAttributeContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 122, HogQLParser::RuleHogqlxTagAttribute); + enterRule(_localctx, 124, HogQLParser::RuleHogqlxTagAttribute); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9314,38 +9401,38 @@ HogQLParser::HogqlxTagAttributeContext* HogQLParser::hogqlxTagAttribute() { exitRule(); }); try { - setState(1126); + setState(1134); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 141, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 142, _ctx)) { case 1: { enterOuterAlt(_localctx, 1); - setState(1115); + setState(1123); identifier(); - setState(1116); + setState(1124); match(HogQLParser::EQ_SINGLE); - setState(1117); + setState(1125); string(); break; } case 2: { enterOuterAlt(_localctx, 2); - setState(1119); + setState(1127); identifier(); - setState(1120); + setState(1128); match(HogQLParser::EQ_SINGLE); - setState(1121); + setState(1129); match(HogQLParser::LBRACE); - setState(1122); + setState(1130); columnExpr(0); - setState(1123); + setState(1131); match(HogQLParser::RBRACE); break; } case 3: { enterOuterAlt(_localctx, 3); - setState(1125); + setState(1133); identifier(); break; } @@ -9401,7 +9488,7 @@ std::any HogQLParser::WithExprListContext::accept(tree::ParseTreeVisitor *visito HogQLParser::WithExprListContext* HogQLParser::withExprList() { WithExprListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 124, HogQLParser::RuleWithExprList); + enterRule(_localctx, 126, HogQLParser::RuleWithExprList); size_t _la = 0; #if __cplusplus > 201703L @@ -9414,28 +9501,28 @@ HogQLParser::WithExprListContext* HogQLParser::withExprList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1128); + setState(1136); withExpr(); - setState(1133); + setState(1141); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 142, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 143, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1129); + setState(1137); match(HogQLParser::COMMA); - setState(1130); + setState(1138); withExpr(); } - setState(1135); + setState(1143); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 142, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 143, _ctx); } - setState(1137); + setState(1145); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1136); + setState(1144); match(HogQLParser::COMMA); } @@ -9501,8 +9588,8 @@ tree::TerminalNode* HogQLParser::WithExprSubqueryContext::LPAREN() { return getToken(HogQLParser::LPAREN, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::WithExprSubqueryContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::WithExprSubqueryContext::selectSetStmt() { + return getRuleContext(0); } tree::TerminalNode* HogQLParser::WithExprSubqueryContext::RPAREN() { @@ -9520,7 +9607,7 @@ std::any HogQLParser::WithExprSubqueryContext::accept(tree::ParseTreeVisitor *vi } HogQLParser::WithExprContext* HogQLParser::withExpr() { WithExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 126, HogQLParser::RuleWithExpr); + enterRule(_localctx, 128, HogQLParser::RuleWithExpr); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9530,21 +9617,21 @@ HogQLParser::WithExprContext* HogQLParser::withExpr() { exitRule(); }); try { - setState(1149); + setState(1157); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 144, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 145, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 1); - setState(1139); + setState(1147); identifier(); - setState(1140); + setState(1148); match(HogQLParser::AS); - setState(1141); + setState(1149); match(HogQLParser::LPAREN); - setState(1142); - selectUnionStmt(); - setState(1143); + setState(1150); + selectSetStmt(); + setState(1151); match(HogQLParser::RPAREN); break; } @@ -9552,11 +9639,11 @@ HogQLParser::WithExprContext* HogQLParser::withExpr() { case 2: { _localctx = _tracker.createInstance(_localctx); enterOuterAlt(_localctx, 2); - setState(1145); + setState(1153); columnExpr(0); - setState(1146); + setState(1154); match(HogQLParser::AS); - setState(1147); + setState(1155); identifier(); break; } @@ -9612,7 +9699,7 @@ std::any HogQLParser::ColumnIdentifierContext::accept(tree::ParseTreeVisitor *vi HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { ColumnIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 128, HogQLParser::RuleColumnIdentifier); + enterRule(_localctx, 130, HogQLParser::RuleColumnIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9622,12 +9709,12 @@ HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { exitRule(); }); try { - setState(1158); + setState(1166); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::LBRACE: { enterOuterAlt(_localctx, 1); - setState(1151); + setState(1159); placeholder(); break; } @@ -9727,14 +9814,14 @@ HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { case HogQLParser::YEAR: case HogQLParser::IDENTIFIER: { enterOuterAlt(_localctx, 2); - setState(1155); + setState(1163); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 145, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 146, _ctx)) { case 1: { - setState(1152); + setState(1160); tableIdentifier(); - setState(1153); + setState(1161); match(HogQLParser::DOT); break; } @@ -9742,7 +9829,7 @@ HogQLParser::ColumnIdentifierContext* HogQLParser::columnIdentifier() { default: break; } - setState(1157); + setState(1165); nestedIdentifier(); break; } @@ -9798,7 +9885,7 @@ std::any HogQLParser::NestedIdentifierContext::accept(tree::ParseTreeVisitor *vi HogQLParser::NestedIdentifierContext* HogQLParser::nestedIdentifier() { NestedIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 130, HogQLParser::RuleNestedIdentifier); + enterRule(_localctx, 132, HogQLParser::RuleNestedIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -9810,21 +9897,21 @@ HogQLParser::NestedIdentifierContext* HogQLParser::nestedIdentifier() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1160); + setState(1168); identifier(); - setState(1165); + setState(1173); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 147, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 148, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1161); + setState(1169); match(HogQLParser::DOT); - setState(1162); + setState(1170); identifier(); } - setState(1167); + setState(1175); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 147, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 148, _ctx); } } @@ -9903,8 +9990,8 @@ tree::TerminalNode* HogQLParser::TableExprSubqueryContext::LPAREN() { return getToken(HogQLParser::LPAREN, 0); } -HogQLParser::SelectUnionStmtContext* HogQLParser::TableExprSubqueryContext::selectUnionStmt() { - return getRuleContext(0); +HogQLParser::SelectSetStmtContext* HogQLParser::TableExprSubqueryContext::selectSetStmt() { + return getRuleContext(0); } tree::TerminalNode* HogQLParser::TableExprSubqueryContext::RPAREN() { @@ -9973,8 +10060,8 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { HogQLParser::TableExprContext *_localctx = _tracker.createInstance(_ctx, parentState); HogQLParser::TableExprContext *previousContext = _localctx; (void)previousContext; // Silence compiler, in case the context is not used by generated code. - size_t startState = 132; - enterRecursionRule(_localctx, 132, HogQLParser::RuleTableExpr, precedence); + size_t startState = 134; + enterRecursionRule(_localctx, 134, HogQLParser::RuleTableExpr, precedence); @@ -9988,15 +10075,15 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1177); + setState(1185); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 148, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 149, _ctx)) { case 1: { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1169); + setState(1177); tableIdentifier(); break; } @@ -10005,7 +10092,7 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1170); + setState(1178); tableFunctionExpr(); break; } @@ -10014,11 +10101,11 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1171); + setState(1179); match(HogQLParser::LPAREN); - setState(1172); - selectUnionStmt(); - setState(1173); + setState(1180); + selectSetStmt(); + setState(1181); match(HogQLParser::RPAREN); break; } @@ -10027,7 +10114,7 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1175); + setState(1183); hogqlxTagElement(); break; } @@ -10036,7 +10123,7 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { _localctx = _tracker.createInstance(_localctx); _ctx = _localctx; previousContext = _localctx; - setState(1176); + setState(1184); placeholder(); break; } @@ -10045,9 +10132,9 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { break; } _ctx->stop = _input->LT(-1); - setState(1187); + setState(1195); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 150, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 151, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { if (!_parseListeners.empty()) @@ -10056,10 +10143,10 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { auto newContext = _tracker.createInstance(_tracker.createInstance(parentContext, parentState)); _localctx = newContext; pushNewRecursionContext(newContext, startState, RuleTableExpr); - setState(1179); + setState(1187); if (!(precpred(_ctx, 3))) throw FailedPredicateException(this, "precpred(_ctx, 3)"); - setState(1183); + setState(1191); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::DATE: @@ -10067,15 +10154,15 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { case HogQLParser::ID: case HogQLParser::KEY: case HogQLParser::IDENTIFIER: { - setState(1180); + setState(1188); alias(); break; } case HogQLParser::AS: { - setState(1181); + setState(1189); match(HogQLParser::AS); - setState(1182); + setState(1190); identifier(); break; } @@ -10084,9 +10171,9 @@ HogQLParser::TableExprContext* HogQLParser::tableExpr(int precedence) { throw NoViableAltException(this); } } - setState(1189); + setState(1197); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 150, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 151, _ctx); } } catch (RecognitionException &e) { @@ -10134,7 +10221,7 @@ std::any HogQLParser::TableFunctionExprContext::accept(tree::ParseTreeVisitor *v HogQLParser::TableFunctionExprContext* HogQLParser::tableFunctionExpr() { TableFunctionExprContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 134, HogQLParser::RuleTableFunctionExpr); + enterRule(_localctx, 136, HogQLParser::RuleTableFunctionExpr); size_t _la = 0; #if __cplusplus > 201703L @@ -10146,22 +10233,22 @@ HogQLParser::TableFunctionExprContext* HogQLParser::tableFunctionExpr() { }); try { enterOuterAlt(_localctx, 1); - setState(1190); + setState(1198); identifier(); - setState(1191); + setState(1199); match(HogQLParser::LPAREN); - setState(1193); + setState(1201); _errHandler->sync(this); _la = _input->LA(1); if ((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -9007270658588674) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 180986072486903807) != 0) || ((((_la - 129) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 129)) & 18455) != 0)) { - setState(1192); + ((1ULL << _la) & -36169677449216002) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 723944289947615231) != 0) || ((((_la - 131) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 131)) & 18455) != 0)) { + setState(1200); tableArgList(); } - setState(1195); + setState(1203); match(HogQLParser::RPAREN); } @@ -10207,7 +10294,7 @@ std::any HogQLParser::TableIdentifierContext::accept(tree::ParseTreeVisitor *vis HogQLParser::TableIdentifierContext* HogQLParser::tableIdentifier() { TableIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 136, HogQLParser::RuleTableIdentifier); + enterRule(_localctx, 138, HogQLParser::RuleTableIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10218,14 +10305,14 @@ HogQLParser::TableIdentifierContext* HogQLParser::tableIdentifier() { }); try { enterOuterAlt(_localctx, 1); - setState(1200); + setState(1208); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 152, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 153, _ctx)) { case 1: { - setState(1197); + setState(1205); databaseIdentifier(); - setState(1198); + setState(1206); match(HogQLParser::DOT); break; } @@ -10233,7 +10320,7 @@ HogQLParser::TableIdentifierContext* HogQLParser::tableIdentifier() { default: break; } - setState(1202); + setState(1210); identifier(); } @@ -10283,7 +10370,7 @@ std::any HogQLParser::TableArgListContext::accept(tree::ParseTreeVisitor *visito HogQLParser::TableArgListContext* HogQLParser::tableArgList() { TableArgListContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 138, HogQLParser::RuleTableArgList); + enterRule(_localctx, 140, HogQLParser::RuleTableArgList); size_t _la = 0; #if __cplusplus > 201703L @@ -10296,28 +10383,28 @@ HogQLParser::TableArgListContext* HogQLParser::tableArgList() { try { size_t alt; enterOuterAlt(_localctx, 1); - setState(1204); + setState(1212); columnExpr(0); - setState(1209); + setState(1217); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 153, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 154, _ctx); while (alt != 2 && alt != atn::ATN::INVALID_ALT_NUMBER) { if (alt == 1) { - setState(1205); + setState(1213); match(HogQLParser::COMMA); - setState(1206); + setState(1214); columnExpr(0); } - setState(1211); + setState(1219); _errHandler->sync(this); - alt = getInterpreter()->adaptivePredict(_input, 153, _ctx); + alt = getInterpreter()->adaptivePredict(_input, 154, _ctx); } - setState(1213); + setState(1221); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::COMMA) { - setState(1212); + setState(1220); match(HogQLParser::COMMA); } @@ -10356,7 +10443,7 @@ std::any HogQLParser::DatabaseIdentifierContext::accept(tree::ParseTreeVisitor * HogQLParser::DatabaseIdentifierContext* HogQLParser::databaseIdentifier() { DatabaseIdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 140, HogQLParser::RuleDatabaseIdentifier); + enterRule(_localctx, 142, HogQLParser::RuleDatabaseIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10367,7 +10454,7 @@ HogQLParser::DatabaseIdentifierContext* HogQLParser::databaseIdentifier() { }); try { enterOuterAlt(_localctx, 1); - setState(1215); + setState(1223); identifier(); } @@ -10421,7 +10508,7 @@ std::any HogQLParser::FloatingLiteralContext::accept(tree::ParseTreeVisitor *vis HogQLParser::FloatingLiteralContext* HogQLParser::floatingLiteral() { FloatingLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 142, HogQLParser::RuleFloatingLiteral); + enterRule(_localctx, 144, HogQLParser::RuleFloatingLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -10432,21 +10519,21 @@ HogQLParser::FloatingLiteralContext* HogQLParser::floatingLiteral() { exitRule(); }); try { - setState(1225); + setState(1233); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::FLOATING_LITERAL: { enterOuterAlt(_localctx, 1); - setState(1217); + setState(1225); match(HogQLParser::FLOATING_LITERAL); break; } case HogQLParser::DOT: { enterOuterAlt(_localctx, 2); - setState(1218); + setState(1226); match(HogQLParser::DOT); - setState(1219); + setState(1227); _la = _input->LA(1); if (!(_la == HogQLParser::OCTAL_LITERAL @@ -10462,16 +10549,16 @@ HogQLParser::FloatingLiteralContext* HogQLParser::floatingLiteral() { case HogQLParser::DECIMAL_LITERAL: { enterOuterAlt(_localctx, 3); - setState(1220); + setState(1228); match(HogQLParser::DECIMAL_LITERAL); - setState(1221); + setState(1229); match(HogQLParser::DOT); - setState(1223); + setState(1231); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 155, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 156, _ctx)) { case 1: { - setState(1222); + setState(1230); _la = _input->LA(1); if (!(_la == HogQLParser::OCTAL_LITERAL @@ -10558,7 +10645,7 @@ std::any HogQLParser::NumberLiteralContext::accept(tree::ParseTreeVisitor *visit HogQLParser::NumberLiteralContext* HogQLParser::numberLiteral() { NumberLiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 144, HogQLParser::RuleNumberLiteral); + enterRule(_localctx, 146, HogQLParser::RuleNumberLiteral); size_t _la = 0; #if __cplusplus > 201703L @@ -10570,14 +10657,14 @@ HogQLParser::NumberLiteralContext* HogQLParser::numberLiteral() { }); try { enterOuterAlt(_localctx, 1); - setState(1228); + setState(1236); _errHandler->sync(this); _la = _input->LA(1); if (_la == HogQLParser::DASH || _la == HogQLParser::PLUS) { - setState(1227); + setState(1235); _la = _input->LA(1); if (!(_la == HogQLParser::DASH @@ -10589,41 +10676,41 @@ HogQLParser::NumberLiteralContext* HogQLParser::numberLiteral() { consume(); } } - setState(1236); + setState(1244); _errHandler->sync(this); - switch (getInterpreter()->adaptivePredict(_input, 158, _ctx)) { + switch (getInterpreter()->adaptivePredict(_input, 159, _ctx)) { case 1: { - setState(1230); + setState(1238); floatingLiteral(); break; } case 2: { - setState(1231); + setState(1239); match(HogQLParser::OCTAL_LITERAL); break; } case 3: { - setState(1232); + setState(1240); match(HogQLParser::DECIMAL_LITERAL); break; } case 4: { - setState(1233); + setState(1241); match(HogQLParser::HEXADECIMAL_LITERAL); break; } case 5: { - setState(1234); + setState(1242); match(HogQLParser::INF); break; } case 6: { - setState(1235); + setState(1243); match(HogQLParser::NAN_SQL); break; } @@ -10675,7 +10762,7 @@ std::any HogQLParser::LiteralContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::LiteralContext* HogQLParser::literal() { LiteralContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 146, HogQLParser::RuleLiteral); + enterRule(_localctx, 148, HogQLParser::RuleLiteral); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -10685,7 +10772,7 @@ HogQLParser::LiteralContext* HogQLParser::literal() { exitRule(); }); try { - setState(1241); + setState(1249); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::INF: @@ -10698,21 +10785,21 @@ HogQLParser::LiteralContext* HogQLParser::literal() { case HogQLParser::DOT: case HogQLParser::PLUS: { enterOuterAlt(_localctx, 1); - setState(1238); + setState(1246); numberLiteral(); break; } case HogQLParser::STRING_LITERAL: { enterOuterAlt(_localctx, 2); - setState(1239); + setState(1247); match(HogQLParser::STRING_LITERAL); break; } case HogQLParser::NULL_SQL: { enterOuterAlt(_localctx, 3); - setState(1240); + setState(1248); match(HogQLParser::NULL_SQL); break; } @@ -10784,7 +10871,7 @@ std::any HogQLParser::IntervalContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::IntervalContext* HogQLParser::interval() { IntervalContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 148, HogQLParser::RuleInterval); + enterRule(_localctx, 150, HogQLParser::RuleInterval); size_t _la = 0; #if __cplusplus > 201703L @@ -10796,11 +10883,11 @@ HogQLParser::IntervalContext* HogQLParser::interval() { }); try { enterOuterAlt(_localctx, 1); - setState(1243); + setState(1251); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 216173331871694848) != 0) || ((((_la - 71) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 71)) & 8724152577) != 0))) { + ((1ULL << _la) & 864692227968860160) != 0) || ((((_la - 73) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 73)) & 8724152577) != 0))) { _errHandler->recoverInline(this); } else { @@ -11179,7 +11266,7 @@ std::any HogQLParser::KeywordContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::KeywordContext* HogQLParser::keyword() { KeywordContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 150, HogQLParser::RuleKeyword); + enterRule(_localctx, 152, HogQLParser::RuleKeyword); size_t _la = 0; #if __cplusplus > 201703L @@ -11191,11 +11278,11 @@ HogQLParser::KeywordContext* HogQLParser::keyword() { }); try { enterOuterAlt(_localctx, 1); - setState(1245); + setState(1253); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & -1666350075474886658) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && - ((1ULL << (_la - 64)) & 943816933247) != 0))) { + ((1ULL << _la) & -6665504612824399874) != 0) || ((((_la - 64) & ~ 0x3fULL) == 0) && + ((1ULL << (_la - 64)) & 3775267732991) != 0))) { _errHandler->recoverInline(this); } else { @@ -11250,7 +11337,7 @@ std::any HogQLParser::KeywordForAliasContext::accept(tree::ParseTreeVisitor *vis HogQLParser::KeywordForAliasContext* HogQLParser::keywordForAlias() { KeywordForAliasContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 152, HogQLParser::RuleKeywordForAlias); + enterRule(_localctx, 154, HogQLParser::RuleKeywordForAlias); size_t _la = 0; #if __cplusplus > 201703L @@ -11262,10 +11349,10 @@ HogQLParser::KeywordForAliasContext* HogQLParser::keywordForAlias() { }); try { enterOuterAlt(_localctx, 1); - setState(1247); + setState(1255); _la = _input->LA(1); if (!((((_la & ~ 0x3fULL) == 0) && - ((1ULL << _la) & 564050539839488) != 0))) { + ((1ULL << _la) & 2254000985473024) != 0))) { _errHandler->recoverInline(this); } else { @@ -11312,7 +11399,7 @@ std::any HogQLParser::AliasContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::AliasContext* HogQLParser::alias() { AliasContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 154, HogQLParser::RuleAlias); + enterRule(_localctx, 156, HogQLParser::RuleAlias); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11322,12 +11409,12 @@ HogQLParser::AliasContext* HogQLParser::alias() { exitRule(); }); try { - setState(1251); + setState(1259); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::IDENTIFIER: { enterOuterAlt(_localctx, 1); - setState(1249); + setState(1257); match(HogQLParser::IDENTIFIER); break; } @@ -11337,7 +11424,7 @@ HogQLParser::AliasContext* HogQLParser::alias() { case HogQLParser::ID: case HogQLParser::KEY: { enterOuterAlt(_localctx, 2); - setState(1250); + setState(1258); keywordForAlias(); break; } @@ -11389,7 +11476,7 @@ std::any HogQLParser::IdentifierContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::IdentifierContext* HogQLParser::identifier() { IdentifierContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 156, HogQLParser::RuleIdentifier); + enterRule(_localctx, 158, HogQLParser::RuleIdentifier); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11399,12 +11486,12 @@ HogQLParser::IdentifierContext* HogQLParser::identifier() { exitRule(); }); try { - setState(1256); + setState(1264); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::IDENTIFIER: { enterOuterAlt(_localctx, 1); - setState(1253); + setState(1261); match(HogQLParser::IDENTIFIER); break; } @@ -11418,7 +11505,7 @@ HogQLParser::IdentifierContext* HogQLParser::identifier() { case HogQLParser::WEEK: case HogQLParser::YEAR: { enterOuterAlt(_localctx, 2); - setState(1254); + setState(1262); interval(); break; } @@ -11509,7 +11596,7 @@ HogQLParser::IdentifierContext* HogQLParser::identifier() { case HogQLParser::WINDOW: case HogQLParser::WITH: { enterOuterAlt(_localctx, 3); - setState(1255); + setState(1263); keyword(); break; } @@ -11561,7 +11648,7 @@ std::any HogQLParser::EnumValueContext::accept(tree::ParseTreeVisitor *visitor) HogQLParser::EnumValueContext* HogQLParser::enumValue() { EnumValueContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 158, HogQLParser::RuleEnumValue); + enterRule(_localctx, 160, HogQLParser::RuleEnumValue); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11572,11 +11659,11 @@ HogQLParser::EnumValueContext* HogQLParser::enumValue() { }); try { enterOuterAlt(_localctx, 1); - setState(1258); + setState(1266); string(); - setState(1259); + setState(1267); match(HogQLParser::EQ_SINGLE); - setState(1260); + setState(1268); numberLiteral(); } @@ -11622,7 +11709,7 @@ std::any HogQLParser::PlaceholderContext::accept(tree::ParseTreeVisitor *visitor HogQLParser::PlaceholderContext* HogQLParser::placeholder() { PlaceholderContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 160, HogQLParser::RulePlaceholder); + enterRule(_localctx, 162, HogQLParser::RulePlaceholder); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11633,11 +11720,11 @@ HogQLParser::PlaceholderContext* HogQLParser::placeholder() { }); try { enterOuterAlt(_localctx, 1); - setState(1262); + setState(1270); match(HogQLParser::LBRACE); - setState(1263); + setState(1271); columnExpr(0); - setState(1264); + setState(1272); match(HogQLParser::RBRACE); } @@ -11679,7 +11766,7 @@ std::any HogQLParser::StringContext::accept(tree::ParseTreeVisitor *visitor) { HogQLParser::StringContext* HogQLParser::string() { StringContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 162, HogQLParser::RuleString); + enterRule(_localctx, 164, HogQLParser::RuleString); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11689,19 +11776,19 @@ HogQLParser::StringContext* HogQLParser::string() { exitRule(); }); try { - setState(1268); + setState(1276); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::STRING_LITERAL: { enterOuterAlt(_localctx, 1); - setState(1266); + setState(1274); match(HogQLParser::STRING_LITERAL); break; } case HogQLParser::QUOTE_SINGLE_TEMPLATE: { enterOuterAlt(_localctx, 2); - setState(1267); + setState(1275); templateString(); break; } @@ -11757,7 +11844,7 @@ std::any HogQLParser::TemplateStringContext::accept(tree::ParseTreeVisitor *visi HogQLParser::TemplateStringContext* HogQLParser::templateString() { TemplateStringContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 164, HogQLParser::RuleTemplateString); + enterRule(_localctx, 166, HogQLParser::RuleTemplateString); size_t _la = 0; #if __cplusplus > 201703L @@ -11769,21 +11856,21 @@ HogQLParser::TemplateStringContext* HogQLParser::templateString() { }); try { enterOuterAlt(_localctx, 1); - setState(1270); + setState(1278); match(HogQLParser::QUOTE_SINGLE_TEMPLATE); - setState(1274); + setState(1282); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::STRING_TEXT || _la == HogQLParser::STRING_ESCAPE_TRIGGER) { - setState(1271); + setState(1279); stringContents(); - setState(1276); + setState(1284); _errHandler->sync(this); _la = _input->LA(1); } - setState(1277); + setState(1285); match(HogQLParser::QUOTE_SINGLE); } @@ -11833,7 +11920,7 @@ std::any HogQLParser::StringContentsContext::accept(tree::ParseTreeVisitor *visi HogQLParser::StringContentsContext* HogQLParser::stringContents() { StringContentsContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 166, HogQLParser::RuleStringContents); + enterRule(_localctx, 168, HogQLParser::RuleStringContents); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -11843,23 +11930,23 @@ HogQLParser::StringContentsContext* HogQLParser::stringContents() { exitRule(); }); try { - setState(1284); + setState(1292); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::STRING_ESCAPE_TRIGGER: { enterOuterAlt(_localctx, 1); - setState(1279); + setState(1287); match(HogQLParser::STRING_ESCAPE_TRIGGER); - setState(1280); + setState(1288); columnExpr(0); - setState(1281); + setState(1289); match(HogQLParser::RBRACE); break; } case HogQLParser::STRING_TEXT: { enterOuterAlt(_localctx, 2); - setState(1283); + setState(1291); match(HogQLParser::STRING_TEXT); break; } @@ -11915,7 +12002,7 @@ std::any HogQLParser::FullTemplateStringContext::accept(tree::ParseTreeVisitor * HogQLParser::FullTemplateStringContext* HogQLParser::fullTemplateString() { FullTemplateStringContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 168, HogQLParser::RuleFullTemplateString); + enterRule(_localctx, 170, HogQLParser::RuleFullTemplateString); size_t _la = 0; #if __cplusplus > 201703L @@ -11927,21 +12014,21 @@ HogQLParser::FullTemplateStringContext* HogQLParser::fullTemplateString() { }); try { enterOuterAlt(_localctx, 1); - setState(1286); + setState(1294); match(HogQLParser::QUOTE_SINGLE_TEMPLATE_FULL); - setState(1290); + setState(1298); _errHandler->sync(this); _la = _input->LA(1); while (_la == HogQLParser::FULL_STRING_TEXT || _la == HogQLParser::FULL_STRING_ESCAPE_TRIGGER) { - setState(1287); + setState(1295); stringContentsFull(); - setState(1292); + setState(1300); _errHandler->sync(this); _la = _input->LA(1); } - setState(1293); + setState(1301); match(HogQLParser::EOF); } @@ -11991,7 +12078,7 @@ std::any HogQLParser::StringContentsFullContext::accept(tree::ParseTreeVisitor * HogQLParser::StringContentsFullContext* HogQLParser::stringContentsFull() { StringContentsFullContext *_localctx = _tracker.createInstance(_ctx, getState()); - enterRule(_localctx, 170, HogQLParser::RuleStringContentsFull); + enterRule(_localctx, 172, HogQLParser::RuleStringContentsFull); #if __cplusplus > 201703L auto onExit = finally([=, this] { @@ -12001,23 +12088,23 @@ HogQLParser::StringContentsFullContext* HogQLParser::stringContentsFull() { exitRule(); }); try { - setState(1300); + setState(1308); _errHandler->sync(this); switch (_input->LA(1)) { case HogQLParser::FULL_STRING_ESCAPE_TRIGGER: { enterOuterAlt(_localctx, 1); - setState(1295); + setState(1303); match(HogQLParser::FULL_STRING_ESCAPE_TRIGGER); - setState(1296); + setState(1304); columnExpr(0); - setState(1297); + setState(1305); match(HogQLParser::RBRACE); break; } case HogQLParser::FULL_STRING_TEXT: { enterOuterAlt(_localctx, 2); - setState(1299); + setState(1307); match(HogQLParser::FULL_STRING_TEXT); break; } @@ -12038,9 +12125,9 @@ HogQLParser::StringContentsFullContext* HogQLParser::stringContentsFull() { bool HogQLParser::sempred(RuleContext *context, size_t ruleIndex, size_t predicateIndex) { switch (ruleIndex) { - case 39: return joinExprSempred(antlrcpp::downCast(context), predicateIndex); - case 58: return columnExprSempred(antlrcpp::downCast(context), predicateIndex); - case 66: return tableExprSempred(antlrcpp::downCast(context), predicateIndex); + case 40: return joinExprSempred(antlrcpp::downCast(context), predicateIndex); + case 59: return columnExprSempred(antlrcpp::downCast(context), predicateIndex); + case 67: return tableExprSempred(antlrcpp::downCast(context), predicateIndex); default: break; diff --git a/hogql_parser/HogQLParser.h b/hogql_parser/HogQLParser.h index f607422676954..4c59a3bdc4209 100644 --- a/hogql_parser/HogQLParser.h +++ b/hogql_parser/HogQLParser.h @@ -16,32 +16,33 @@ class HogQLParser : public antlr4::Parser { ASOF = 8, BETWEEN = 9, BOTH = 10, BY = 11, CASE = 12, CAST = 13, CATCH = 14, COHORT = 15, COLLATE = 16, CROSS = 17, CUBE = 18, CURRENT = 19, DATE = 20, DAY = 21, DESC = 22, DESCENDING = 23, DISTINCT = 24, ELSE = 25, END = 26, - EXTRACT = 27, FINAL = 28, FINALLY = 29, FIRST = 30, FN = 31, FOLLOWING = 32, - FOR = 33, FROM = 34, FULL = 35, FUN = 36, GROUP = 37, HAVING = 38, HOUR = 39, - ID = 40, IF = 41, ILIKE = 42, IN = 43, INF = 44, INNER = 45, INTERVAL = 46, - IS = 47, JOIN = 48, KEY = 49, LAST = 50, LEADING = 51, LEFT = 52, LET = 53, - LIKE = 54, LIMIT = 55, MINUTE = 56, MONTH = 57, NAN_SQL = 58, NOT = 59, - NULL_SQL = 60, NULLS = 61, OFFSET = 62, ON = 63, OR = 64, ORDER = 65, - OUTER = 66, OVER = 67, PARTITION = 68, PRECEDING = 69, PREWHERE = 70, - QUARTER = 71, RANGE = 72, RETURN = 73, RIGHT = 74, ROLLUP = 75, ROW = 76, - ROWS = 77, SAMPLE = 78, SECOND = 79, SELECT = 80, SEMI = 81, SETTINGS = 82, - SUBSTRING = 83, THEN = 84, THROW = 85, TIES = 86, TIMESTAMP = 87, TO = 88, - TOP = 89, TOTALS = 90, TRAILING = 91, TRIM = 92, TRUNCATE = 93, TRY = 94, - UNBOUNDED = 95, UNION = 96, USING = 97, WEEK = 98, WHEN = 99, WHERE = 100, - WHILE = 101, WINDOW = 102, WITH = 103, YEAR = 104, ESCAPE_CHAR_COMMON = 105, - IDENTIFIER = 106, FLOATING_LITERAL = 107, OCTAL_LITERAL = 108, DECIMAL_LITERAL = 109, - HEXADECIMAL_LITERAL = 110, STRING_LITERAL = 111, ARROW = 112, ASTERISK = 113, - BACKQUOTE = 114, BACKSLASH = 115, COLON = 116, COMMA = 117, CONCAT = 118, - DASH = 119, DOLLAR = 120, DOT = 121, EQ_DOUBLE = 122, EQ_SINGLE = 123, - GT_EQ = 124, GT = 125, HASH = 126, IREGEX_SINGLE = 127, IREGEX_DOUBLE = 128, - LBRACE = 129, LBRACKET = 130, LPAREN = 131, LT_EQ = 132, LT = 133, NOT_EQ = 134, - NOT_IREGEX = 135, NOT_REGEX = 136, NULL_PROPERTY = 137, NULLISH = 138, - PERCENT = 139, PLUS = 140, QUERY = 141, QUOTE_DOUBLE = 142, QUOTE_SINGLE_TEMPLATE = 143, - QUOTE_SINGLE_TEMPLATE_FULL = 144, QUOTE_SINGLE = 145, REGEX_SINGLE = 146, - REGEX_DOUBLE = 147, RBRACE = 148, RBRACKET = 149, RPAREN = 150, SEMICOLON = 151, - SLASH = 152, UNDERSCORE = 153, MULTI_LINE_COMMENT = 154, SINGLE_LINE_COMMENT = 155, - WHITESPACE = 156, STRING_TEXT = 157, STRING_ESCAPE_TRIGGER = 158, FULL_STRING_TEXT = 159, - FULL_STRING_ESCAPE_TRIGGER = 160 + EXCEPT = 27, EXTRACT = 28, FINAL = 29, FINALLY = 30, FIRST = 31, FN = 32, + FOLLOWING = 33, FOR = 34, FROM = 35, FULL = 36, FUN = 37, GROUP = 38, + HAVING = 39, HOUR = 40, ID = 41, IF = 42, ILIKE = 43, IN = 44, INF = 45, + INNER = 46, INTERSECT = 47, INTERVAL = 48, IS = 49, JOIN = 50, KEY = 51, + LAST = 52, LEADING = 53, LEFT = 54, LET = 55, LIKE = 56, LIMIT = 57, + MINUTE = 58, MONTH = 59, NAN_SQL = 60, NOT = 61, NULL_SQL = 62, NULLS = 63, + OFFSET = 64, ON = 65, OR = 66, ORDER = 67, OUTER = 68, OVER = 69, PARTITION = 70, + PRECEDING = 71, PREWHERE = 72, QUARTER = 73, RANGE = 74, RETURN = 75, + RIGHT = 76, ROLLUP = 77, ROW = 78, ROWS = 79, SAMPLE = 80, SECOND = 81, + SELECT = 82, SEMI = 83, SETTINGS = 84, SUBSTRING = 85, THEN = 86, THROW = 87, + TIES = 88, TIMESTAMP = 89, TO = 90, TOP = 91, TOTALS = 92, TRAILING = 93, + TRIM = 94, TRUNCATE = 95, TRY = 96, UNBOUNDED = 97, UNION = 98, USING = 99, + WEEK = 100, WHEN = 101, WHERE = 102, WHILE = 103, WINDOW = 104, WITH = 105, + YEAR = 106, ESCAPE_CHAR_COMMON = 107, IDENTIFIER = 108, FLOATING_LITERAL = 109, + OCTAL_LITERAL = 110, DECIMAL_LITERAL = 111, HEXADECIMAL_LITERAL = 112, + STRING_LITERAL = 113, ARROW = 114, ASTERISK = 115, BACKQUOTE = 116, + BACKSLASH = 117, COLON = 118, COMMA = 119, CONCAT = 120, DASH = 121, + DOLLAR = 122, DOT = 123, EQ_DOUBLE = 124, EQ_SINGLE = 125, GT_EQ = 126, + GT = 127, HASH = 128, IREGEX_SINGLE = 129, IREGEX_DOUBLE = 130, LBRACE = 131, + LBRACKET = 132, LPAREN = 133, LT_EQ = 134, LT = 135, NOT_EQ = 136, NOT_IREGEX = 137, + NOT_REGEX = 138, NULL_PROPERTY = 139, NULLISH = 140, PERCENT = 141, + PLUS = 142, QUERY = 143, QUOTE_DOUBLE = 144, QUOTE_SINGLE_TEMPLATE = 145, + QUOTE_SINGLE_TEMPLATE_FULL = 146, QUOTE_SINGLE = 147, REGEX_SINGLE = 148, + REGEX_DOUBLE = 149, RBRACE = 150, RBRACKET = 151, RPAREN = 152, SEMICOLON = 153, + SLASH = 154, UNDERSCORE = 155, MULTI_LINE_COMMENT = 156, SINGLE_LINE_COMMENT = 157, + WHITESPACE = 158, STRING_TEXT = 159, STRING_ESCAPE_TRIGGER = 160, FULL_STRING_TEXT = 161, + FULL_STRING_ESCAPE_TRIGGER = 162 }; enum { @@ -50,26 +51,27 @@ class HogQLParser : public antlr4::Parser { RuleCatchBlock = 8, RuleTryCatchStmt = 9, RuleIfStmt = 10, RuleWhileStmt = 11, RuleForStmt = 12, RuleForInStmt = 13, RuleFuncStmt = 14, RuleVarAssignment = 15, RuleExprStmt = 16, RuleEmptyStmt = 17, RuleBlock = 18, RuleKvPair = 19, - RuleKvPairList = 20, RuleSelect = 21, RuleSelectUnionStmt = 22, RuleSelectStmtWithParens = 23, - RuleSelectStmt = 24, RuleWithClause = 25, RuleTopClause = 26, RuleFromClause = 27, - RuleArrayJoinClause = 28, RuleWindowClause = 29, RulePrewhereClause = 30, - RuleWhereClause = 31, RuleGroupByClause = 32, RuleHavingClause = 33, - RuleOrderByClause = 34, RuleProjectionOrderByClause = 35, RuleLimitAndOffsetClause = 36, - RuleOffsetOnlyClause = 37, RuleSettingsClause = 38, RuleJoinExpr = 39, - RuleJoinOp = 40, RuleJoinOpCross = 41, RuleJoinConstraintClause = 42, - RuleSampleClause = 43, RuleOrderExprList = 44, RuleOrderExpr = 45, RuleRatioExpr = 46, - RuleSettingExprList = 47, RuleSettingExpr = 48, RuleWindowExpr = 49, - RuleWinPartitionByClause = 50, RuleWinOrderByClause = 51, RuleWinFrameClause = 52, - RuleWinFrameExtend = 53, RuleWinFrameBound = 54, RuleExpr = 55, RuleColumnTypeExpr = 56, - RuleColumnExprList = 57, RuleColumnExpr = 58, RuleColumnLambdaExpr = 59, - RuleHogqlxTagElement = 60, RuleHogqlxTagAttribute = 61, RuleWithExprList = 62, - RuleWithExpr = 63, RuleColumnIdentifier = 64, RuleNestedIdentifier = 65, - RuleTableExpr = 66, RuleTableFunctionExpr = 67, RuleTableIdentifier = 68, - RuleTableArgList = 69, RuleDatabaseIdentifier = 70, RuleFloatingLiteral = 71, - RuleNumberLiteral = 72, RuleLiteral = 73, RuleInterval = 74, RuleKeyword = 75, - RuleKeywordForAlias = 76, RuleAlias = 77, RuleIdentifier = 78, RuleEnumValue = 79, - RulePlaceholder = 80, RuleString = 81, RuleTemplateString = 82, RuleStringContents = 83, - RuleFullTemplateString = 84, RuleStringContentsFull = 85 + RuleKvPairList = 20, RuleSelect = 21, RuleSelectStmtWithParens = 22, + RuleSubsequentSelectSetClause = 23, RuleSelectSetStmt = 24, RuleSelectStmt = 25, + RuleWithClause = 26, RuleTopClause = 27, RuleFromClause = 28, RuleArrayJoinClause = 29, + RuleWindowClause = 30, RulePrewhereClause = 31, RuleWhereClause = 32, + RuleGroupByClause = 33, RuleHavingClause = 34, RuleOrderByClause = 35, + RuleProjectionOrderByClause = 36, RuleLimitAndOffsetClause = 37, RuleOffsetOnlyClause = 38, + RuleSettingsClause = 39, RuleJoinExpr = 40, RuleJoinOp = 41, RuleJoinOpCross = 42, + RuleJoinConstraintClause = 43, RuleSampleClause = 44, RuleOrderExprList = 45, + RuleOrderExpr = 46, RuleRatioExpr = 47, RuleSettingExprList = 48, RuleSettingExpr = 49, + RuleWindowExpr = 50, RuleWinPartitionByClause = 51, RuleWinOrderByClause = 52, + RuleWinFrameClause = 53, RuleWinFrameExtend = 54, RuleWinFrameBound = 55, + RuleExpr = 56, RuleColumnTypeExpr = 57, RuleColumnExprList = 58, RuleColumnExpr = 59, + RuleColumnLambdaExpr = 60, RuleHogqlxTagElement = 61, RuleHogqlxTagAttribute = 62, + RuleWithExprList = 63, RuleWithExpr = 64, RuleColumnIdentifier = 65, + RuleNestedIdentifier = 66, RuleTableExpr = 67, RuleTableFunctionExpr = 68, + RuleTableIdentifier = 69, RuleTableArgList = 70, RuleDatabaseIdentifier = 71, + RuleFloatingLiteral = 72, RuleNumberLiteral = 73, RuleLiteral = 74, + RuleInterval = 75, RuleKeyword = 76, RuleKeywordForAlias = 77, RuleAlias = 78, + RuleIdentifier = 79, RuleEnumValue = 80, RulePlaceholder = 81, RuleString = 82, + RuleTemplateString = 83, RuleStringContents = 84, RuleFullTemplateString = 85, + RuleStringContentsFull = 86 }; explicit HogQLParser(antlr4::TokenStream *input); @@ -111,8 +113,9 @@ class HogQLParser : public antlr4::Parser { class KvPairContext; class KvPairListContext; class SelectContext; - class SelectUnionStmtContext; class SelectStmtWithParensContext; + class SubsequentSelectSetClauseContext; + class SelectSetStmtContext; class SelectStmtContext; class WithClauseContext; class TopClauseContext; @@ -552,7 +555,7 @@ class HogQLParser : public antlr4::Parser { SelectContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; antlr4::tree::TerminalNode *EOF(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); SelectStmtContext *selectStmt(); HogqlxTagElementContext *hogqlxTagElement(); @@ -563,40 +566,54 @@ class HogQLParser : public antlr4::Parser { SelectContext* select(); - class SelectUnionStmtContext : public antlr4::ParserRuleContext { + class SelectStmtWithParensContext : public antlr4::ParserRuleContext { public: - SelectUnionStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState); + SelectStmtWithParensContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - std::vector selectStmtWithParens(); - SelectStmtWithParensContext* selectStmtWithParens(size_t i); - std::vector UNION(); - antlr4::tree::TerminalNode* UNION(size_t i); - std::vector ALL(); - antlr4::tree::TerminalNode* ALL(size_t i); + SelectStmtContext *selectStmt(); + antlr4::tree::TerminalNode *LPAREN(); + SelectSetStmtContext *selectSetStmt(); + antlr4::tree::TerminalNode *RPAREN(); + PlaceholderContext *placeholder(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; - SelectUnionStmtContext* selectUnionStmt(); + SelectStmtWithParensContext* selectStmtWithParens(); - class SelectStmtWithParensContext : public antlr4::ParserRuleContext { + class SubsequentSelectSetClauseContext : public antlr4::ParserRuleContext { public: - SelectStmtWithParensContext(antlr4::ParserRuleContext *parent, size_t invokingState); + SubsequentSelectSetClauseContext(antlr4::ParserRuleContext *parent, size_t invokingState); virtual size_t getRuleIndex() const override; - SelectStmtContext *selectStmt(); - antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); - antlr4::tree::TerminalNode *RPAREN(); - PlaceholderContext *placeholder(); + SelectStmtWithParensContext *selectStmtWithParens(); + antlr4::tree::TerminalNode *EXCEPT(); + antlr4::tree::TerminalNode *UNION(); + antlr4::tree::TerminalNode *ALL(); + antlr4::tree::TerminalNode *INTERSECT(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; }; - SelectStmtWithParensContext* selectStmtWithParens(); + SubsequentSelectSetClauseContext* subsequentSelectSetClause(); + + class SelectSetStmtContext : public antlr4::ParserRuleContext { + public: + SelectSetStmtContext(antlr4::ParserRuleContext *parent, size_t invokingState); + virtual size_t getRuleIndex() const override; + SelectStmtWithParensContext *selectStmtWithParens(); + std::vector subsequentSelectSetClause(); + SubsequentSelectSetClauseContext* subsequentSelectSetClause(size_t i); + + + virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; + + }; + + SelectSetStmtContext* selectSetStmt(); class SelectStmtContext : public antlr4::ParserRuleContext { public: @@ -1398,7 +1415,7 @@ class HogQLParser : public antlr4::Parser { ColumnExprSubqueryContext(ColumnExprContext *ctx); antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); antlr4::tree::TerminalNode *RPAREN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -1999,7 +2016,7 @@ class HogQLParser : public antlr4::Parser { IdentifierContext *identifier(); antlr4::tree::TerminalNode *AS(); antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); antlr4::tree::TerminalNode *RPAREN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; @@ -2084,7 +2101,7 @@ class HogQLParser : public antlr4::Parser { TableExprSubqueryContext(TableExprContext *ctx); antlr4::tree::TerminalNode *LPAREN(); - SelectUnionStmtContext *selectUnionStmt(); + SelectSetStmtContext *selectSetStmt(); antlr4::tree::TerminalNode *RPAREN(); virtual std::any accept(antlr4::tree::ParseTreeVisitor *visitor) override; diff --git a/hogql_parser/HogQLParser.interp b/hogql_parser/HogQLParser.interp index 86b5777f1ff22..4308ee42ae9b9 100644 --- a/hogql_parser/HogQLParser.interp +++ b/hogql_parser/HogQLParser.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -347,8 +351,9 @@ block kvPair kvPairList select -selectUnionStmt selectStmtWithParens +subsequentSelectSetClause +selectSetStmt selectStmt withClause topClause @@ -414,4 +419,4 @@ stringContentsFull atn: -[4, 1, 160, 1303, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 1, 0, 5, 0, 174, 8, 0, 10, 0, 12, 0, 177, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 183, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 192, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 197, 8, 4, 10, 4, 12, 4, 200, 9, 4, 1, 4, 3, 4, 203, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 217, 8, 5, 1, 6, 1, 6, 3, 6, 221, 8, 6, 1, 6, 3, 6, 224, 8, 6, 1, 7, 1, 7, 3, 7, 228, 8, 7, 1, 7, 3, 7, 231, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 238, 8, 8, 1, 8, 1, 8, 3, 8, 242, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 249, 8, 9, 10, 9, 12, 9, 252, 9, 9, 1, 9, 1, 9, 3, 9, 256, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 265, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 273, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 280, 8, 12, 1, 12, 1, 12, 3, 12, 284, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 290, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 295, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 303, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 310, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 316, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 328, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 334, 8, 18, 10, 18, 12, 18, 337, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 348, 8, 20, 10, 20, 12, 20, 351, 9, 20, 1, 20, 3, 20, 354, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 359, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 367, 8, 22, 10, 22, 12, 22, 370, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 378, 8, 23, 1, 24, 3, 24, 381, 8, 24, 1, 24, 1, 24, 3, 24, 385, 8, 24, 1, 24, 3, 24, 388, 8, 24, 1, 24, 1, 24, 3, 24, 392, 8, 24, 1, 24, 3, 24, 395, 8, 24, 1, 24, 3, 24, 398, 8, 24, 1, 24, 3, 24, 401, 8, 24, 1, 24, 3, 24, 404, 8, 24, 1, 24, 1, 24, 3, 24, 408, 8, 24, 1, 24, 1, 24, 3, 24, 412, 8, 24, 1, 24, 3, 24, 415, 8, 24, 1, 24, 3, 24, 418, 8, 24, 1, 24, 3, 24, 421, 8, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 24, 3, 24, 428, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 437, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 3, 28, 443, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 462, 8, 29, 10, 29, 12, 29, 465, 9, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 481, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 498, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 504, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 510, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 521, 8, 36, 3, 36, 523, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 534, 8, 39, 1, 39, 3, 39, 537, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 543, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 551, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 557, 8, 39, 10, 39, 12, 39, 560, 9, 39, 1, 40, 3, 40, 563, 8, 40, 1, 40, 1, 40, 1, 40, 3, 40, 568, 8, 40, 1, 40, 3, 40, 571, 8, 40, 1, 40, 3, 40, 574, 8, 40, 1, 40, 1, 40, 3, 40, 578, 8, 40, 1, 40, 1, 40, 3, 40, 582, 8, 40, 1, 40, 3, 40, 585, 8, 40, 3, 40, 587, 8, 40, 1, 40, 3, 40, 590, 8, 40, 1, 40, 1, 40, 3, 40, 594, 8, 40, 1, 40, 1, 40, 3, 40, 598, 8, 40, 1, 40, 3, 40, 601, 8, 40, 3, 40, 603, 8, 40, 3, 40, 605, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 610, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 621, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 627, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 632, 8, 44, 10, 44, 12, 44, 635, 9, 44, 1, 45, 1, 45, 3, 45, 639, 8, 45, 1, 45, 1, 45, 3, 45, 643, 8, 45, 1, 45, 1, 45, 3, 45, 647, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 653, 8, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 5, 47, 660, 8, 47, 10, 47, 12, 47, 663, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 3, 49, 670, 8, 49, 1, 49, 3, 49, 673, 8, 49, 1, 49, 3, 49, 676, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 695, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 709, 8, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 723, 8, 56, 10, 56, 12, 56, 726, 9, 56, 1, 56, 3, 56, 729, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 738, 8, 56, 10, 56, 12, 56, 741, 9, 56, 1, 56, 3, 56, 744, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 753, 8, 56, 10, 56, 12, 56, 756, 9, 56, 1, 56, 3, 56, 759, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 766, 8, 56, 1, 56, 1, 56, 3, 56, 770, 8, 56, 1, 57, 1, 57, 1, 57, 5, 57, 775, 8, 57, 10, 57, 12, 57, 778, 9, 57, 1, 57, 3, 57, 781, 8, 57, 1, 58, 1, 58, 1, 58, 3, 58, 786, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 793, 8, 58, 11, 58, 12, 58, 794, 1, 58, 1, 58, 3, 58, 799, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 823, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 840, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 846, 8, 58, 1, 58, 3, 58, 849, 8, 58, 1, 58, 3, 58, 852, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 862, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 868, 8, 58, 1, 58, 3, 58, 871, 8, 58, 1, 58, 3, 58, 874, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 882, 8, 58, 1, 58, 3, 58, 885, 8, 58, 1, 58, 1, 58, 3, 58, 889, 8, 58, 1, 58, 3, 58, 892, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 906, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 923, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 928, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 933, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 939, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 946, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 958, 8, 58, 1, 58, 1, 58, 3, 58, 962, 8, 58, 1, 58, 3, 58, 965, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 974, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 988, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1004, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1033, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1041, 8, 58, 5, 58, 1043, 8, 58, 10, 58, 12, 58, 1046, 9, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1052, 8, 59, 10, 59, 12, 59, 1055, 9, 59, 1, 59, 3, 59, 1058, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1065, 8, 59, 10, 59, 12, 59, 1068, 9, 59, 1, 59, 3, 59, 1071, 8, 59, 1, 59, 1, 59, 3, 59, 1075, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1080, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 1085, 8, 60, 10, 60, 12, 60, 1088, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1096, 8, 60, 10, 60, 12, 60, 1099, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1107, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1114, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1127, 8, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1132, 8, 62, 10, 62, 12, 62, 1135, 9, 62, 1, 62, 3, 62, 1138, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1150, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1156, 8, 64, 1, 64, 3, 64, 1159, 8, 64, 1, 65, 1, 65, 1, 65, 5, 65, 1164, 8, 65, 10, 65, 12, 65, 1167, 9, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1178, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1184, 8, 66, 5, 66, 1186, 8, 66, 10, 66, 12, 66, 1189, 9, 66, 1, 67, 1, 67, 1, 67, 3, 67, 1194, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1201, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 1208, 8, 69, 10, 69, 12, 69, 1211, 9, 69, 1, 69, 3, 69, 1214, 8, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1224, 8, 71, 3, 71, 1226, 8, 71, 1, 72, 3, 72, 1229, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1237, 8, 72, 1, 73, 1, 73, 1, 73, 3, 73, 1242, 8, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 3, 77, 1252, 8, 77, 1, 78, 1, 78, 1, 78, 3, 78, 1257, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 3, 81, 1269, 8, 81, 1, 82, 1, 82, 5, 82, 1273, 8, 82, 10, 82, 12, 82, 1276, 9, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1285, 8, 83, 1, 84, 1, 84, 5, 84, 1289, 8, 84, 10, 84, 12, 84, 1292, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 1301, 8, 85, 1, 85, 0, 3, 78, 116, 132, 86, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 0, 17, 2, 0, 31, 31, 36, 36, 2, 0, 18, 18, 75, 75, 2, 0, 45, 45, 52, 52, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 81, 81, 2, 0, 52, 52, 74, 74, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 30, 30, 50, 50, 2, 0, 72, 72, 77, 77, 3, 0, 10, 10, 51, 51, 91, 91, 2, 0, 42, 42, 54, 54, 1, 0, 108, 109, 2, 0, 119, 119, 140, 140, 7, 0, 21, 21, 39, 39, 56, 57, 71, 71, 79, 79, 98, 98, 104, 104, 17, 0, 1, 13, 15, 20, 22, 28, 30, 30, 32, 35, 37, 38, 40, 43, 45, 52, 54, 55, 59, 59, 61, 70, 72, 78, 80, 84, 86, 93, 95, 97, 99, 100, 102, 103, 4, 0, 20, 20, 30, 30, 40, 40, 49, 49, 1475, 0, 175, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 4, 184, 1, 0, 0, 0, 6, 186, 1, 0, 0, 0, 8, 193, 1, 0, 0, 0, 10, 216, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 225, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 245, 1, 0, 0, 0, 20, 257, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 274, 1, 0, 0, 0, 26, 296, 1, 0, 0, 0, 28, 311, 1, 0, 0, 0, 30, 320, 1, 0, 0, 0, 32, 325, 1, 0, 0, 0, 34, 329, 1, 0, 0, 0, 36, 331, 1, 0, 0, 0, 38, 340, 1, 0, 0, 0, 40, 344, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 362, 1, 0, 0, 0, 46, 377, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 429, 1, 0, 0, 0, 52, 432, 1, 0, 0, 0, 54, 438, 1, 0, 0, 0, 56, 442, 1, 0, 0, 0, 58, 448, 1, 0, 0, 0, 60, 466, 1, 0, 0, 0, 62, 469, 1, 0, 0, 0, 64, 472, 1, 0, 0, 0, 66, 482, 1, 0, 0, 0, 68, 485, 1, 0, 0, 0, 70, 489, 1, 0, 0, 0, 72, 522, 1, 0, 0, 0, 74, 524, 1, 0, 0, 0, 76, 527, 1, 0, 0, 0, 78, 542, 1, 0, 0, 0, 80, 604, 1, 0, 0, 0, 82, 609, 1, 0, 0, 0, 84, 620, 1, 0, 0, 0, 86, 622, 1, 0, 0, 0, 88, 628, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 654, 1, 0, 0, 0, 94, 656, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 669, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 681, 1, 0, 0, 0, 104, 685, 1, 0, 0, 0, 106, 694, 1, 0, 0, 0, 108, 708, 1, 0, 0, 0, 110, 710, 1, 0, 0, 0, 112, 769, 1, 0, 0, 0, 114, 771, 1, 0, 0, 0, 116, 932, 1, 0, 0, 0, 118, 1074, 1, 0, 0, 0, 120, 1113, 1, 0, 0, 0, 122, 1126, 1, 0, 0, 0, 124, 1128, 1, 0, 0, 0, 126, 1149, 1, 0, 0, 0, 128, 1158, 1, 0, 0, 0, 130, 1160, 1, 0, 0, 0, 132, 1177, 1, 0, 0, 0, 134, 1190, 1, 0, 0, 0, 136, 1200, 1, 0, 0, 0, 138, 1204, 1, 0, 0, 0, 140, 1215, 1, 0, 0, 0, 142, 1225, 1, 0, 0, 0, 144, 1228, 1, 0, 0, 0, 146, 1241, 1, 0, 0, 0, 148, 1243, 1, 0, 0, 0, 150, 1245, 1, 0, 0, 0, 152, 1247, 1, 0, 0, 0, 154, 1251, 1, 0, 0, 0, 156, 1256, 1, 0, 0, 0, 158, 1258, 1, 0, 0, 0, 160, 1262, 1, 0, 0, 0, 162, 1268, 1, 0, 0, 0, 164, 1270, 1, 0, 0, 0, 166, 1284, 1, 0, 0, 0, 168, 1286, 1, 0, 0, 0, 170, 1300, 1, 0, 0, 0, 172, 174, 3, 2, 1, 0, 173, 172, 1, 0, 0, 0, 174, 177, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 178, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 179, 5, 0, 0, 1, 179, 1, 1, 0, 0, 0, 180, 183, 3, 6, 3, 0, 181, 183, 3, 10, 5, 0, 182, 180, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 3, 1, 0, 0, 0, 184, 185, 3, 116, 58, 0, 185, 5, 1, 0, 0, 0, 186, 187, 5, 53, 0, 0, 187, 191, 3, 156, 78, 0, 188, 189, 5, 116, 0, 0, 189, 190, 5, 123, 0, 0, 190, 192, 3, 4, 2, 0, 191, 188, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 7, 1, 0, 0, 0, 193, 198, 3, 156, 78, 0, 194, 195, 5, 117, 0, 0, 195, 197, 3, 156, 78, 0, 196, 194, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 203, 5, 117, 0, 0, 202, 201, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 217, 3, 12, 6, 0, 205, 217, 3, 14, 7, 0, 206, 217, 3, 18, 9, 0, 207, 217, 3, 20, 10, 0, 208, 217, 3, 22, 11, 0, 209, 217, 3, 26, 13, 0, 210, 217, 3, 24, 12, 0, 211, 217, 3, 28, 14, 0, 212, 217, 3, 30, 15, 0, 213, 217, 3, 36, 18, 0, 214, 217, 3, 32, 16, 0, 215, 217, 3, 34, 17, 0, 216, 204, 1, 0, 0, 0, 216, 205, 1, 0, 0, 0, 216, 206, 1, 0, 0, 0, 216, 207, 1, 0, 0, 0, 216, 208, 1, 0, 0, 0, 216, 209, 1, 0, 0, 0, 216, 210, 1, 0, 0, 0, 216, 211, 1, 0, 0, 0, 216, 212, 1, 0, 0, 0, 216, 213, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 215, 1, 0, 0, 0, 217, 11, 1, 0, 0, 0, 218, 220, 5, 73, 0, 0, 219, 221, 3, 4, 2, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 223, 1, 0, 0, 0, 222, 224, 5, 151, 0, 0, 223, 222, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 13, 1, 0, 0, 0, 225, 227, 5, 85, 0, 0, 226, 228, 3, 4, 2, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 230, 1, 0, 0, 0, 229, 231, 5, 151, 0, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 15, 1, 0, 0, 0, 232, 241, 5, 14, 0, 0, 233, 234, 5, 131, 0, 0, 234, 237, 3, 156, 78, 0, 235, 236, 5, 116, 0, 0, 236, 238, 3, 156, 78, 0, 237, 235, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 150, 0, 0, 240, 242, 1, 0, 0, 0, 241, 233, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 3, 36, 18, 0, 244, 17, 1, 0, 0, 0, 245, 246, 5, 94, 0, 0, 246, 250, 3, 36, 18, 0, 247, 249, 3, 16, 8, 0, 248, 247, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 255, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 254, 5, 29, 0, 0, 254, 256, 3, 36, 18, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 19, 1, 0, 0, 0, 257, 258, 5, 41, 0, 0, 258, 259, 5, 131, 0, 0, 259, 260, 3, 4, 2, 0, 260, 261, 5, 150, 0, 0, 261, 264, 3, 10, 5, 0, 262, 263, 5, 25, 0, 0, 263, 265, 3, 10, 5, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 21, 1, 0, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 131, 0, 0, 268, 269, 3, 4, 2, 0, 269, 270, 5, 150, 0, 0, 270, 272, 3, 10, 5, 0, 271, 273, 5, 151, 0, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 23, 1, 0, 0, 0, 274, 275, 5, 33, 0, 0, 275, 279, 5, 131, 0, 0, 276, 280, 3, 6, 3, 0, 277, 280, 3, 30, 15, 0, 278, 280, 3, 4, 2, 0, 279, 276, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 278, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 5, 151, 0, 0, 282, 284, 3, 4, 2, 0, 283, 282, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 289, 5, 151, 0, 0, 286, 290, 3, 6, 3, 0, 287, 290, 3, 30, 15, 0, 288, 290, 3, 4, 2, 0, 289, 286, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 5, 150, 0, 0, 292, 294, 3, 10, 5, 0, 293, 295, 5, 151, 0, 0, 294, 293, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 25, 1, 0, 0, 0, 296, 297, 5, 33, 0, 0, 297, 298, 5, 131, 0, 0, 298, 299, 5, 53, 0, 0, 299, 302, 3, 156, 78, 0, 300, 301, 5, 117, 0, 0, 301, 303, 3, 156, 78, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 305, 5, 43, 0, 0, 305, 306, 3, 4, 2, 0, 306, 307, 5, 150, 0, 0, 307, 309, 3, 10, 5, 0, 308, 310, 5, 151, 0, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 27, 1, 0, 0, 0, 311, 312, 7, 0, 0, 0, 312, 313, 3, 156, 78, 0, 313, 315, 5, 131, 0, 0, 314, 316, 3, 8, 4, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 318, 5, 150, 0, 0, 318, 319, 3, 36, 18, 0, 319, 29, 1, 0, 0, 0, 320, 321, 3, 4, 2, 0, 321, 322, 5, 116, 0, 0, 322, 323, 5, 123, 0, 0, 323, 324, 3, 4, 2, 0, 324, 31, 1, 0, 0, 0, 325, 327, 3, 4, 2, 0, 326, 328, 5, 151, 0, 0, 327, 326, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 33, 1, 0, 0, 0, 329, 330, 5, 151, 0, 0, 330, 35, 1, 0, 0, 0, 331, 335, 5, 129, 0, 0, 332, 334, 3, 2, 1, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 148, 0, 0, 339, 37, 1, 0, 0, 0, 340, 341, 3, 4, 2, 0, 341, 342, 5, 116, 0, 0, 342, 343, 3, 4, 2, 0, 343, 39, 1, 0, 0, 0, 344, 349, 3, 38, 19, 0, 345, 346, 5, 117, 0, 0, 346, 348, 3, 38, 19, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 354, 5, 117, 0, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 41, 1, 0, 0, 0, 355, 359, 3, 44, 22, 0, 356, 359, 3, 48, 24, 0, 357, 359, 3, 120, 60, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 5, 0, 0, 1, 361, 43, 1, 0, 0, 0, 362, 368, 3, 46, 23, 0, 363, 364, 5, 96, 0, 0, 364, 365, 5, 1, 0, 0, 365, 367, 3, 46, 23, 0, 366, 363, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 45, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 378, 3, 48, 24, 0, 372, 373, 5, 131, 0, 0, 373, 374, 3, 44, 22, 0, 374, 375, 5, 150, 0, 0, 375, 378, 1, 0, 0, 0, 376, 378, 3, 160, 80, 0, 377, 371, 1, 0, 0, 0, 377, 372, 1, 0, 0, 0, 377, 376, 1, 0, 0, 0, 378, 47, 1, 0, 0, 0, 379, 381, 3, 50, 25, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 384, 5, 80, 0, 0, 383, 385, 5, 24, 0, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 388, 3, 52, 26, 0, 387, 386, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 391, 3, 114, 57, 0, 390, 392, 3, 54, 27, 0, 391, 390, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 395, 3, 56, 28, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 398, 3, 60, 30, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 400, 1, 0, 0, 0, 399, 401, 3, 62, 31, 0, 400, 399, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 403, 1, 0, 0, 0, 402, 404, 3, 64, 32, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 406, 5, 103, 0, 0, 406, 408, 7, 1, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 410, 5, 103, 0, 0, 410, 412, 5, 90, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 417, 1, 0, 0, 0, 416, 418, 3, 58, 29, 0, 417, 416, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 420, 1, 0, 0, 0, 419, 421, 3, 68, 34, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, 425, 3, 72, 36, 0, 423, 425, 3, 74, 37, 0, 424, 422, 1, 0, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 427, 1, 0, 0, 0, 426, 428, 3, 76, 38, 0, 427, 426, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 49, 1, 0, 0, 0, 429, 430, 5, 103, 0, 0, 430, 431, 3, 124, 62, 0, 431, 51, 1, 0, 0, 0, 432, 433, 5, 89, 0, 0, 433, 436, 5, 109, 0, 0, 434, 435, 5, 103, 0, 0, 435, 437, 5, 86, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 53, 1, 0, 0, 0, 438, 439, 5, 34, 0, 0, 439, 440, 3, 78, 39, 0, 440, 55, 1, 0, 0, 0, 441, 443, 7, 2, 0, 0, 442, 441, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 5, 5, 0, 0, 445, 446, 5, 48, 0, 0, 446, 447, 3, 114, 57, 0, 447, 57, 1, 0, 0, 0, 448, 449, 5, 102, 0, 0, 449, 450, 3, 156, 78, 0, 450, 451, 5, 6, 0, 0, 451, 452, 5, 131, 0, 0, 452, 453, 3, 98, 49, 0, 453, 463, 5, 150, 0, 0, 454, 455, 5, 117, 0, 0, 455, 456, 3, 156, 78, 0, 456, 457, 5, 6, 0, 0, 457, 458, 5, 131, 0, 0, 458, 459, 3, 98, 49, 0, 459, 460, 5, 150, 0, 0, 460, 462, 1, 0, 0, 0, 461, 454, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 59, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 466, 467, 5, 70, 0, 0, 467, 468, 3, 116, 58, 0, 468, 61, 1, 0, 0, 0, 469, 470, 5, 100, 0, 0, 470, 471, 3, 116, 58, 0, 471, 63, 1, 0, 0, 0, 472, 473, 5, 37, 0, 0, 473, 480, 5, 11, 0, 0, 474, 475, 7, 1, 0, 0, 475, 476, 5, 131, 0, 0, 476, 477, 3, 114, 57, 0, 477, 478, 5, 150, 0, 0, 478, 481, 1, 0, 0, 0, 479, 481, 3, 114, 57, 0, 480, 474, 1, 0, 0, 0, 480, 479, 1, 0, 0, 0, 481, 65, 1, 0, 0, 0, 482, 483, 5, 38, 0, 0, 483, 484, 3, 116, 58, 0, 484, 67, 1, 0, 0, 0, 485, 486, 5, 65, 0, 0, 486, 487, 5, 11, 0, 0, 487, 488, 3, 88, 44, 0, 488, 69, 1, 0, 0, 0, 489, 490, 5, 65, 0, 0, 490, 491, 5, 11, 0, 0, 491, 492, 3, 114, 57, 0, 492, 71, 1, 0, 0, 0, 493, 494, 5, 55, 0, 0, 494, 497, 3, 116, 58, 0, 495, 496, 5, 117, 0, 0, 496, 498, 3, 116, 58, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 503, 1, 0, 0, 0, 499, 500, 5, 103, 0, 0, 500, 504, 5, 86, 0, 0, 501, 502, 5, 11, 0, 0, 502, 504, 3, 114, 57, 0, 503, 499, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 55, 0, 0, 506, 509, 3, 116, 58, 0, 507, 508, 5, 103, 0, 0, 508, 510, 5, 86, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 62, 0, 0, 512, 513, 3, 116, 58, 0, 513, 523, 1, 0, 0, 0, 514, 515, 5, 55, 0, 0, 515, 516, 3, 116, 58, 0, 516, 517, 5, 62, 0, 0, 517, 520, 3, 116, 58, 0, 518, 519, 5, 11, 0, 0, 519, 521, 3, 114, 57, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 523, 1, 0, 0, 0, 522, 493, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 514, 1, 0, 0, 0, 523, 73, 1, 0, 0, 0, 524, 525, 5, 62, 0, 0, 525, 526, 3, 116, 58, 0, 526, 75, 1, 0, 0, 0, 527, 528, 5, 82, 0, 0, 528, 529, 3, 94, 47, 0, 529, 77, 1, 0, 0, 0, 530, 531, 6, 39, -1, 0, 531, 533, 3, 132, 66, 0, 532, 534, 5, 28, 0, 0, 533, 532, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 536, 1, 0, 0, 0, 535, 537, 3, 86, 43, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 543, 1, 0, 0, 0, 538, 539, 5, 131, 0, 0, 539, 540, 3, 78, 39, 0, 540, 541, 5, 150, 0, 0, 541, 543, 1, 0, 0, 0, 542, 530, 1, 0, 0, 0, 542, 538, 1, 0, 0, 0, 543, 558, 1, 0, 0, 0, 544, 545, 10, 3, 0, 0, 545, 546, 3, 82, 41, 0, 546, 547, 3, 78, 39, 4, 547, 557, 1, 0, 0, 0, 548, 550, 10, 4, 0, 0, 549, 551, 3, 80, 40, 0, 550, 549, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 5, 48, 0, 0, 553, 554, 3, 78, 39, 0, 554, 555, 3, 84, 42, 0, 555, 557, 1, 0, 0, 0, 556, 544, 1, 0, 0, 0, 556, 548, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 79, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 561, 563, 7, 3, 0, 0, 562, 561, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 571, 5, 45, 0, 0, 565, 567, 5, 45, 0, 0, 566, 568, 7, 3, 0, 0, 567, 566, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 562, 1, 0, 0, 0, 570, 565, 1, 0, 0, 0, 570, 569, 1, 0, 0, 0, 571, 605, 1, 0, 0, 0, 572, 574, 7, 4, 0, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 577, 7, 5, 0, 0, 576, 578, 5, 66, 0, 0, 577, 576, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 587, 1, 0, 0, 0, 579, 581, 7, 5, 0, 0, 580, 582, 5, 66, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 584, 1, 0, 0, 0, 583, 585, 7, 4, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 587, 1, 0, 0, 0, 586, 573, 1, 0, 0, 0, 586, 579, 1, 0, 0, 0, 587, 605, 1, 0, 0, 0, 588, 590, 7, 6, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 593, 5, 35, 0, 0, 592, 594, 5, 66, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 603, 1, 0, 0, 0, 595, 597, 5, 35, 0, 0, 596, 598, 5, 66, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 600, 1, 0, 0, 0, 599, 601, 7, 6, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 603, 1, 0, 0, 0, 602, 589, 1, 0, 0, 0, 602, 595, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 570, 1, 0, 0, 0, 604, 586, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 81, 1, 0, 0, 0, 606, 607, 5, 17, 0, 0, 607, 610, 5, 48, 0, 0, 608, 610, 5, 117, 0, 0, 609, 606, 1, 0, 0, 0, 609, 608, 1, 0, 0, 0, 610, 83, 1, 0, 0, 0, 611, 612, 5, 63, 0, 0, 612, 621, 3, 114, 57, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 131, 0, 0, 615, 616, 3, 114, 57, 0, 616, 617, 5, 150, 0, 0, 617, 621, 1, 0, 0, 0, 618, 619, 5, 97, 0, 0, 619, 621, 3, 114, 57, 0, 620, 611, 1, 0, 0, 0, 620, 613, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 85, 1, 0, 0, 0, 622, 623, 5, 78, 0, 0, 623, 626, 3, 92, 46, 0, 624, 625, 5, 62, 0, 0, 625, 627, 3, 92, 46, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 87, 1, 0, 0, 0, 628, 633, 3, 90, 45, 0, 629, 630, 5, 117, 0, 0, 630, 632, 3, 90, 45, 0, 631, 629, 1, 0, 0, 0, 632, 635, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 89, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 636, 638, 3, 116, 58, 0, 637, 639, 7, 7, 0, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 642, 1, 0, 0, 0, 640, 641, 5, 61, 0, 0, 641, 643, 7, 8, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 646, 1, 0, 0, 0, 644, 645, 5, 16, 0, 0, 645, 647, 5, 111, 0, 0, 646, 644, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 91, 1, 0, 0, 0, 648, 655, 3, 160, 80, 0, 649, 652, 3, 144, 72, 0, 650, 651, 5, 152, 0, 0, 651, 653, 3, 144, 72, 0, 652, 650, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 648, 1, 0, 0, 0, 654, 649, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 661, 3, 96, 48, 0, 657, 658, 5, 117, 0, 0, 658, 660, 3, 96, 48, 0, 659, 657, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 95, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 3, 156, 78, 0, 665, 666, 5, 123, 0, 0, 666, 667, 3, 146, 73, 0, 667, 97, 1, 0, 0, 0, 668, 670, 3, 100, 50, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 673, 3, 102, 51, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 676, 3, 104, 52, 0, 675, 674, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 99, 1, 0, 0, 0, 677, 678, 5, 68, 0, 0, 678, 679, 5, 11, 0, 0, 679, 680, 3, 114, 57, 0, 680, 101, 1, 0, 0, 0, 681, 682, 5, 65, 0, 0, 682, 683, 5, 11, 0, 0, 683, 684, 3, 88, 44, 0, 684, 103, 1, 0, 0, 0, 685, 686, 7, 9, 0, 0, 686, 687, 3, 106, 53, 0, 687, 105, 1, 0, 0, 0, 688, 695, 3, 108, 54, 0, 689, 690, 5, 9, 0, 0, 690, 691, 3, 108, 54, 0, 691, 692, 5, 2, 0, 0, 692, 693, 3, 108, 54, 0, 693, 695, 1, 0, 0, 0, 694, 688, 1, 0, 0, 0, 694, 689, 1, 0, 0, 0, 695, 107, 1, 0, 0, 0, 696, 697, 5, 19, 0, 0, 697, 709, 5, 76, 0, 0, 698, 699, 5, 95, 0, 0, 699, 709, 5, 69, 0, 0, 700, 701, 5, 95, 0, 0, 701, 709, 5, 32, 0, 0, 702, 703, 3, 144, 72, 0, 703, 704, 5, 69, 0, 0, 704, 709, 1, 0, 0, 0, 705, 706, 3, 144, 72, 0, 706, 707, 5, 32, 0, 0, 707, 709, 1, 0, 0, 0, 708, 696, 1, 0, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 705, 1, 0, 0, 0, 709, 109, 1, 0, 0, 0, 710, 711, 3, 116, 58, 0, 711, 712, 5, 0, 0, 1, 712, 111, 1, 0, 0, 0, 713, 770, 3, 156, 78, 0, 714, 715, 3, 156, 78, 0, 715, 716, 5, 131, 0, 0, 716, 717, 3, 156, 78, 0, 717, 724, 3, 112, 56, 0, 718, 719, 5, 117, 0, 0, 719, 720, 3, 156, 78, 0, 720, 721, 3, 112, 56, 0, 721, 723, 1, 0, 0, 0, 722, 718, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 729, 5, 117, 0, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 150, 0, 0, 731, 770, 1, 0, 0, 0, 732, 733, 3, 156, 78, 0, 733, 734, 5, 131, 0, 0, 734, 739, 3, 158, 79, 0, 735, 736, 5, 117, 0, 0, 736, 738, 3, 158, 79, 0, 737, 735, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 744, 5, 117, 0, 0, 743, 742, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 5, 150, 0, 0, 746, 770, 1, 0, 0, 0, 747, 748, 3, 156, 78, 0, 748, 749, 5, 131, 0, 0, 749, 754, 3, 112, 56, 0, 750, 751, 5, 117, 0, 0, 751, 753, 3, 112, 56, 0, 752, 750, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 759, 5, 117, 0, 0, 758, 757, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 761, 5, 150, 0, 0, 761, 770, 1, 0, 0, 0, 762, 763, 3, 156, 78, 0, 763, 765, 5, 131, 0, 0, 764, 766, 3, 114, 57, 0, 765, 764, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 5, 150, 0, 0, 768, 770, 1, 0, 0, 0, 769, 713, 1, 0, 0, 0, 769, 714, 1, 0, 0, 0, 769, 732, 1, 0, 0, 0, 769, 747, 1, 0, 0, 0, 769, 762, 1, 0, 0, 0, 770, 113, 1, 0, 0, 0, 771, 776, 3, 116, 58, 0, 772, 773, 5, 117, 0, 0, 773, 775, 3, 116, 58, 0, 774, 772, 1, 0, 0, 0, 775, 778, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 780, 1, 0, 0, 0, 778, 776, 1, 0, 0, 0, 779, 781, 5, 117, 0, 0, 780, 779, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 115, 1, 0, 0, 0, 782, 783, 6, 58, -1, 0, 783, 785, 5, 12, 0, 0, 784, 786, 3, 116, 58, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 792, 1, 0, 0, 0, 787, 788, 5, 99, 0, 0, 788, 789, 3, 116, 58, 0, 789, 790, 5, 84, 0, 0, 790, 791, 3, 116, 58, 0, 791, 793, 1, 0, 0, 0, 792, 787, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 798, 1, 0, 0, 0, 796, 797, 5, 25, 0, 0, 797, 799, 3, 116, 58, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 5, 26, 0, 0, 801, 933, 1, 0, 0, 0, 802, 803, 5, 13, 0, 0, 803, 804, 5, 131, 0, 0, 804, 805, 3, 116, 58, 0, 805, 806, 5, 6, 0, 0, 806, 807, 3, 112, 56, 0, 807, 808, 5, 150, 0, 0, 808, 933, 1, 0, 0, 0, 809, 810, 5, 20, 0, 0, 810, 933, 5, 111, 0, 0, 811, 812, 5, 46, 0, 0, 812, 813, 3, 116, 58, 0, 813, 814, 3, 148, 74, 0, 814, 933, 1, 0, 0, 0, 815, 816, 5, 83, 0, 0, 816, 817, 5, 131, 0, 0, 817, 818, 3, 116, 58, 0, 818, 819, 5, 34, 0, 0, 819, 822, 3, 116, 58, 0, 820, 821, 5, 33, 0, 0, 821, 823, 3, 116, 58, 0, 822, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 825, 5, 150, 0, 0, 825, 933, 1, 0, 0, 0, 826, 827, 5, 87, 0, 0, 827, 933, 5, 111, 0, 0, 828, 829, 5, 92, 0, 0, 829, 830, 5, 131, 0, 0, 830, 831, 7, 10, 0, 0, 831, 832, 3, 162, 81, 0, 832, 833, 5, 34, 0, 0, 833, 834, 3, 116, 58, 0, 834, 835, 5, 150, 0, 0, 835, 933, 1, 0, 0, 0, 836, 837, 3, 156, 78, 0, 837, 839, 5, 131, 0, 0, 838, 840, 3, 114, 57, 0, 839, 838, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 5, 150, 0, 0, 842, 851, 1, 0, 0, 0, 843, 845, 5, 131, 0, 0, 844, 846, 5, 24, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 848, 1, 0, 0, 0, 847, 849, 3, 114, 57, 0, 848, 847, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 5, 150, 0, 0, 851, 843, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 67, 0, 0, 854, 855, 5, 131, 0, 0, 855, 856, 3, 98, 49, 0, 856, 857, 5, 150, 0, 0, 857, 933, 1, 0, 0, 0, 858, 859, 3, 156, 78, 0, 859, 861, 5, 131, 0, 0, 860, 862, 3, 114, 57, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 5, 150, 0, 0, 864, 873, 1, 0, 0, 0, 865, 867, 5, 131, 0, 0, 866, 868, 5, 24, 0, 0, 867, 866, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 871, 3, 114, 57, 0, 870, 869, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 874, 5, 150, 0, 0, 873, 865, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 5, 67, 0, 0, 876, 877, 3, 156, 78, 0, 877, 933, 1, 0, 0, 0, 878, 884, 3, 156, 78, 0, 879, 881, 5, 131, 0, 0, 880, 882, 3, 114, 57, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 5, 150, 0, 0, 884, 879, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 888, 5, 131, 0, 0, 887, 889, 5, 24, 0, 0, 888, 887, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 891, 1, 0, 0, 0, 890, 892, 3, 114, 57, 0, 891, 890, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 5, 150, 0, 0, 894, 933, 1, 0, 0, 0, 895, 933, 3, 120, 60, 0, 896, 933, 3, 164, 82, 0, 897, 933, 3, 146, 73, 0, 898, 899, 5, 119, 0, 0, 899, 933, 3, 116, 58, 20, 900, 901, 5, 59, 0, 0, 901, 933, 3, 116, 58, 14, 902, 903, 3, 136, 68, 0, 903, 904, 5, 121, 0, 0, 904, 906, 1, 0, 0, 0, 905, 902, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 933, 5, 113, 0, 0, 908, 909, 5, 131, 0, 0, 909, 910, 3, 44, 22, 0, 910, 911, 5, 150, 0, 0, 911, 933, 1, 0, 0, 0, 912, 913, 5, 131, 0, 0, 913, 914, 3, 116, 58, 0, 914, 915, 5, 150, 0, 0, 915, 933, 1, 0, 0, 0, 916, 917, 5, 131, 0, 0, 917, 918, 3, 114, 57, 0, 918, 919, 5, 150, 0, 0, 919, 933, 1, 0, 0, 0, 920, 922, 5, 130, 0, 0, 921, 923, 3, 114, 57, 0, 922, 921, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 933, 5, 149, 0, 0, 925, 927, 5, 129, 0, 0, 926, 928, 3, 40, 20, 0, 927, 926, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 933, 5, 148, 0, 0, 930, 933, 3, 118, 59, 0, 931, 933, 3, 128, 64, 0, 932, 782, 1, 0, 0, 0, 932, 802, 1, 0, 0, 0, 932, 809, 1, 0, 0, 0, 932, 811, 1, 0, 0, 0, 932, 815, 1, 0, 0, 0, 932, 826, 1, 0, 0, 0, 932, 828, 1, 0, 0, 0, 932, 836, 1, 0, 0, 0, 932, 858, 1, 0, 0, 0, 932, 878, 1, 0, 0, 0, 932, 895, 1, 0, 0, 0, 932, 896, 1, 0, 0, 0, 932, 897, 1, 0, 0, 0, 932, 898, 1, 0, 0, 0, 932, 900, 1, 0, 0, 0, 932, 905, 1, 0, 0, 0, 932, 908, 1, 0, 0, 0, 932, 912, 1, 0, 0, 0, 932, 916, 1, 0, 0, 0, 932, 920, 1, 0, 0, 0, 932, 925, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 932, 931, 1, 0, 0, 0, 933, 1044, 1, 0, 0, 0, 934, 938, 10, 19, 0, 0, 935, 939, 5, 113, 0, 0, 936, 939, 5, 152, 0, 0, 937, 939, 5, 139, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 1043, 3, 116, 58, 20, 941, 945, 10, 18, 0, 0, 942, 946, 5, 140, 0, 0, 943, 946, 5, 119, 0, 0, 944, 946, 5, 118, 0, 0, 945, 942, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 1043, 3, 116, 58, 19, 948, 973, 10, 17, 0, 0, 949, 974, 5, 122, 0, 0, 950, 974, 5, 123, 0, 0, 951, 974, 5, 134, 0, 0, 952, 974, 5, 132, 0, 0, 953, 974, 5, 133, 0, 0, 954, 974, 5, 124, 0, 0, 955, 974, 5, 125, 0, 0, 956, 958, 5, 59, 0, 0, 957, 956, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 961, 5, 43, 0, 0, 960, 962, 5, 15, 0, 0, 961, 960, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 974, 1, 0, 0, 0, 963, 965, 5, 59, 0, 0, 964, 963, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 974, 7, 11, 0, 0, 967, 974, 5, 146, 0, 0, 968, 974, 5, 147, 0, 0, 969, 974, 5, 136, 0, 0, 970, 974, 5, 127, 0, 0, 971, 974, 5, 128, 0, 0, 972, 974, 5, 135, 0, 0, 973, 949, 1, 0, 0, 0, 973, 950, 1, 0, 0, 0, 973, 951, 1, 0, 0, 0, 973, 952, 1, 0, 0, 0, 973, 953, 1, 0, 0, 0, 973, 954, 1, 0, 0, 0, 973, 955, 1, 0, 0, 0, 973, 957, 1, 0, 0, 0, 973, 964, 1, 0, 0, 0, 973, 967, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 969, 1, 0, 0, 0, 973, 970, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 973, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 1043, 3, 116, 58, 18, 976, 977, 10, 15, 0, 0, 977, 978, 5, 138, 0, 0, 978, 1043, 3, 116, 58, 16, 979, 980, 10, 13, 0, 0, 980, 981, 5, 2, 0, 0, 981, 1043, 3, 116, 58, 14, 982, 983, 10, 12, 0, 0, 983, 984, 5, 64, 0, 0, 984, 1043, 3, 116, 58, 13, 985, 987, 10, 11, 0, 0, 986, 988, 5, 59, 0, 0, 987, 986, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 5, 9, 0, 0, 990, 991, 3, 116, 58, 0, 991, 992, 5, 2, 0, 0, 992, 993, 3, 116, 58, 12, 993, 1043, 1, 0, 0, 0, 994, 995, 10, 10, 0, 0, 995, 996, 5, 141, 0, 0, 996, 997, 3, 116, 58, 0, 997, 998, 5, 116, 0, 0, 998, 999, 3, 116, 58, 10, 999, 1043, 1, 0, 0, 0, 1000, 1001, 10, 30, 0, 0, 1001, 1003, 5, 131, 0, 0, 1002, 1004, 3, 114, 57, 0, 1003, 1002, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1043, 5, 150, 0, 0, 1006, 1007, 10, 26, 0, 0, 1007, 1008, 5, 130, 0, 0, 1008, 1009, 3, 116, 58, 0, 1009, 1010, 5, 149, 0, 0, 1010, 1043, 1, 0, 0, 0, 1011, 1012, 10, 25, 0, 0, 1012, 1013, 5, 121, 0, 0, 1013, 1043, 5, 109, 0, 0, 1014, 1015, 10, 24, 0, 0, 1015, 1016, 5, 121, 0, 0, 1016, 1043, 3, 156, 78, 0, 1017, 1018, 10, 23, 0, 0, 1018, 1019, 5, 137, 0, 0, 1019, 1020, 5, 130, 0, 0, 1020, 1021, 3, 116, 58, 0, 1021, 1022, 5, 149, 0, 0, 1022, 1043, 1, 0, 0, 0, 1023, 1024, 10, 22, 0, 0, 1024, 1025, 5, 137, 0, 0, 1025, 1043, 5, 109, 0, 0, 1026, 1027, 10, 21, 0, 0, 1027, 1028, 5, 137, 0, 0, 1028, 1043, 3, 156, 78, 0, 1029, 1030, 10, 16, 0, 0, 1030, 1032, 5, 47, 0, 0, 1031, 1033, 5, 59, 0, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1043, 5, 60, 0, 0, 1035, 1040, 10, 9, 0, 0, 1036, 1037, 5, 6, 0, 0, 1037, 1041, 3, 156, 78, 0, 1038, 1039, 5, 6, 0, 0, 1039, 1041, 5, 111, 0, 0, 1040, 1036, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1041, 1043, 1, 0, 0, 0, 1042, 934, 1, 0, 0, 0, 1042, 941, 1, 0, 0, 0, 1042, 948, 1, 0, 0, 0, 1042, 976, 1, 0, 0, 0, 1042, 979, 1, 0, 0, 0, 1042, 982, 1, 0, 0, 0, 1042, 985, 1, 0, 0, 0, 1042, 994, 1, 0, 0, 0, 1042, 1000, 1, 0, 0, 0, 1042, 1006, 1, 0, 0, 0, 1042, 1011, 1, 0, 0, 0, 1042, 1014, 1, 0, 0, 0, 1042, 1017, 1, 0, 0, 0, 1042, 1023, 1, 0, 0, 0, 1042, 1026, 1, 0, 0, 0, 1042, 1029, 1, 0, 0, 0, 1042, 1035, 1, 0, 0, 0, 1043, 1046, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 117, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1047, 1048, 5, 131, 0, 0, 1048, 1053, 3, 156, 78, 0, 1049, 1050, 5, 117, 0, 0, 1050, 1052, 3, 156, 78, 0, 1051, 1049, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1057, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1056, 1058, 5, 117, 0, 0, 1057, 1056, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 150, 0, 0, 1060, 1075, 1, 0, 0, 0, 1061, 1066, 3, 156, 78, 0, 1062, 1063, 5, 117, 0, 0, 1063, 1065, 3, 156, 78, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1068, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1069, 1071, 5, 117, 0, 0, 1070, 1069, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1075, 1, 0, 0, 0, 1072, 1073, 5, 131, 0, 0, 1073, 1075, 5, 150, 0, 0, 1074, 1047, 1, 0, 0, 0, 1074, 1061, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1079, 5, 112, 0, 0, 1077, 1080, 3, 116, 58, 0, 1078, 1080, 3, 36, 18, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1078, 1, 0, 0, 0, 1080, 119, 1, 0, 0, 0, 1081, 1082, 5, 133, 0, 0, 1082, 1086, 3, 156, 78, 0, 1083, 1085, 3, 122, 61, 0, 1084, 1083, 1, 0, 0, 0, 1085, 1088, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1086, 1, 0, 0, 0, 1089, 1090, 5, 152, 0, 0, 1090, 1091, 5, 125, 0, 0, 1091, 1114, 1, 0, 0, 0, 1092, 1093, 5, 133, 0, 0, 1093, 1097, 3, 156, 78, 0, 1094, 1096, 3, 122, 61, 0, 1095, 1094, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1106, 5, 125, 0, 0, 1101, 1107, 3, 120, 60, 0, 1102, 1103, 5, 129, 0, 0, 1103, 1104, 3, 116, 58, 0, 1104, 1105, 5, 148, 0, 0, 1105, 1107, 1, 0, 0, 0, 1106, 1101, 1, 0, 0, 0, 1106, 1102, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 5, 133, 0, 0, 1109, 1110, 5, 152, 0, 0, 1110, 1111, 3, 156, 78, 0, 1111, 1112, 5, 125, 0, 0, 1112, 1114, 1, 0, 0, 0, 1113, 1081, 1, 0, 0, 0, 1113, 1092, 1, 0, 0, 0, 1114, 121, 1, 0, 0, 0, 1115, 1116, 3, 156, 78, 0, 1116, 1117, 5, 123, 0, 0, 1117, 1118, 3, 162, 81, 0, 1118, 1127, 1, 0, 0, 0, 1119, 1120, 3, 156, 78, 0, 1120, 1121, 5, 123, 0, 0, 1121, 1122, 5, 129, 0, 0, 1122, 1123, 3, 116, 58, 0, 1123, 1124, 5, 148, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1127, 3, 156, 78, 0, 1126, 1115, 1, 0, 0, 0, 1126, 1119, 1, 0, 0, 0, 1126, 1125, 1, 0, 0, 0, 1127, 123, 1, 0, 0, 0, 1128, 1133, 3, 126, 63, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1132, 3, 126, 63, 0, 1131, 1129, 1, 0, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1137, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1136, 1138, 5, 117, 0, 0, 1137, 1136, 1, 0, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 125, 1, 0, 0, 0, 1139, 1140, 3, 156, 78, 0, 1140, 1141, 5, 6, 0, 0, 1141, 1142, 5, 131, 0, 0, 1142, 1143, 3, 44, 22, 0, 1143, 1144, 5, 150, 0, 0, 1144, 1150, 1, 0, 0, 0, 1145, 1146, 3, 116, 58, 0, 1146, 1147, 5, 6, 0, 0, 1147, 1148, 3, 156, 78, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1139, 1, 0, 0, 0, 1149, 1145, 1, 0, 0, 0, 1150, 127, 1, 0, 0, 0, 1151, 1159, 3, 160, 80, 0, 1152, 1153, 3, 136, 68, 0, 1153, 1154, 5, 121, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1152, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 3, 130, 65, 0, 1158, 1151, 1, 0, 0, 0, 1158, 1155, 1, 0, 0, 0, 1159, 129, 1, 0, 0, 0, 1160, 1165, 3, 156, 78, 0, 1161, 1162, 5, 121, 0, 0, 1162, 1164, 3, 156, 78, 0, 1163, 1161, 1, 0, 0, 0, 1164, 1167, 1, 0, 0, 0, 1165, 1163, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 131, 1, 0, 0, 0, 1167, 1165, 1, 0, 0, 0, 1168, 1169, 6, 66, -1, 0, 1169, 1178, 3, 136, 68, 0, 1170, 1178, 3, 134, 67, 0, 1171, 1172, 5, 131, 0, 0, 1172, 1173, 3, 44, 22, 0, 1173, 1174, 5, 150, 0, 0, 1174, 1178, 1, 0, 0, 0, 1175, 1178, 3, 120, 60, 0, 1176, 1178, 3, 160, 80, 0, 1177, 1168, 1, 0, 0, 0, 1177, 1170, 1, 0, 0, 0, 1177, 1171, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1177, 1176, 1, 0, 0, 0, 1178, 1187, 1, 0, 0, 0, 1179, 1183, 10, 3, 0, 0, 1180, 1184, 3, 154, 77, 0, 1181, 1182, 5, 6, 0, 0, 1182, 1184, 3, 156, 78, 0, 1183, 1180, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1186, 1189, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 133, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1190, 1191, 3, 156, 78, 0, 1191, 1193, 5, 131, 0, 0, 1192, 1194, 3, 138, 69, 0, 1193, 1192, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 5, 150, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1198, 3, 140, 70, 0, 1198, 1199, 5, 121, 0, 0, 1199, 1201, 1, 0, 0, 0, 1200, 1197, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 3, 156, 78, 0, 1203, 137, 1, 0, 0, 0, 1204, 1209, 3, 116, 58, 0, 1205, 1206, 5, 117, 0, 0, 1206, 1208, 3, 116, 58, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1213, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1214, 5, 117, 0, 0, 1213, 1212, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 139, 1, 0, 0, 0, 1215, 1216, 3, 156, 78, 0, 1216, 141, 1, 0, 0, 0, 1217, 1226, 5, 107, 0, 0, 1218, 1219, 5, 121, 0, 0, 1219, 1226, 7, 12, 0, 0, 1220, 1221, 5, 109, 0, 0, 1221, 1223, 5, 121, 0, 0, 1222, 1224, 7, 12, 0, 0, 1223, 1222, 1, 0, 0, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1220, 1, 0, 0, 0, 1226, 143, 1, 0, 0, 0, 1227, 1229, 7, 13, 0, 0, 1228, 1227, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1236, 1, 0, 0, 0, 1230, 1237, 3, 142, 71, 0, 1231, 1237, 5, 108, 0, 0, 1232, 1237, 5, 109, 0, 0, 1233, 1237, 5, 110, 0, 0, 1234, 1237, 5, 44, 0, 0, 1235, 1237, 5, 58, 0, 0, 1236, 1230, 1, 0, 0, 0, 1236, 1231, 1, 0, 0, 0, 1236, 1232, 1, 0, 0, 0, 1236, 1233, 1, 0, 0, 0, 1236, 1234, 1, 0, 0, 0, 1236, 1235, 1, 0, 0, 0, 1237, 145, 1, 0, 0, 0, 1238, 1242, 3, 144, 72, 0, 1239, 1242, 5, 111, 0, 0, 1240, 1242, 5, 60, 0, 0, 1241, 1238, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1240, 1, 0, 0, 0, 1242, 147, 1, 0, 0, 0, 1243, 1244, 7, 14, 0, 0, 1244, 149, 1, 0, 0, 0, 1245, 1246, 7, 15, 0, 0, 1246, 151, 1, 0, 0, 0, 1247, 1248, 7, 16, 0, 0, 1248, 153, 1, 0, 0, 0, 1249, 1252, 5, 106, 0, 0, 1250, 1252, 3, 152, 76, 0, 1251, 1249, 1, 0, 0, 0, 1251, 1250, 1, 0, 0, 0, 1252, 155, 1, 0, 0, 0, 1253, 1257, 5, 106, 0, 0, 1254, 1257, 3, 148, 74, 0, 1255, 1257, 3, 150, 75, 0, 1256, 1253, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1255, 1, 0, 0, 0, 1257, 157, 1, 0, 0, 0, 1258, 1259, 3, 162, 81, 0, 1259, 1260, 5, 123, 0, 0, 1260, 1261, 3, 144, 72, 0, 1261, 159, 1, 0, 0, 0, 1262, 1263, 5, 129, 0, 0, 1263, 1264, 3, 116, 58, 0, 1264, 1265, 5, 148, 0, 0, 1265, 161, 1, 0, 0, 0, 1266, 1269, 5, 111, 0, 0, 1267, 1269, 3, 164, 82, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 163, 1, 0, 0, 0, 1270, 1274, 5, 143, 0, 0, 1271, 1273, 3, 166, 83, 0, 1272, 1271, 1, 0, 0, 0, 1273, 1276, 1, 0, 0, 0, 1274, 1272, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1277, 1, 0, 0, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1278, 5, 145, 0, 0, 1278, 165, 1, 0, 0, 0, 1279, 1280, 5, 158, 0, 0, 1280, 1281, 3, 116, 58, 0, 1281, 1282, 5, 148, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1285, 5, 157, 0, 0, 1284, 1279, 1, 0, 0, 0, 1284, 1283, 1, 0, 0, 0, 1285, 167, 1, 0, 0, 0, 1286, 1290, 5, 144, 0, 0, 1287, 1289, 3, 170, 85, 0, 1288, 1287, 1, 0, 0, 0, 1289, 1292, 1, 0, 0, 0, 1290, 1288, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1293, 1294, 5, 0, 0, 1, 1294, 169, 1, 0, 0, 0, 1295, 1296, 5, 160, 0, 0, 1296, 1297, 3, 116, 58, 0, 1297, 1298, 5, 148, 0, 0, 1298, 1301, 1, 0, 0, 0, 1299, 1301, 5, 159, 0, 0, 1300, 1295, 1, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 171, 1, 0, 0, 0, 167, 175, 182, 191, 198, 202, 216, 220, 223, 227, 230, 237, 241, 250, 255, 264, 272, 279, 283, 289, 294, 302, 309, 315, 327, 335, 349, 353, 358, 368, 377, 380, 384, 387, 391, 394, 397, 400, 403, 407, 411, 414, 417, 420, 424, 427, 436, 442, 463, 480, 497, 503, 509, 520, 522, 533, 536, 542, 550, 556, 558, 562, 567, 570, 573, 577, 581, 584, 586, 589, 593, 597, 600, 602, 604, 609, 620, 626, 633, 638, 642, 646, 652, 654, 661, 669, 672, 675, 694, 708, 724, 728, 739, 743, 754, 758, 765, 769, 776, 780, 785, 794, 798, 822, 839, 845, 848, 851, 861, 867, 870, 873, 881, 884, 888, 891, 905, 922, 927, 932, 938, 945, 957, 961, 964, 973, 987, 1003, 1032, 1040, 1042, 1044, 1053, 1057, 1066, 1070, 1074, 1079, 1086, 1097, 1106, 1113, 1126, 1133, 1137, 1149, 1155, 1158, 1165, 1177, 1183, 1187, 1193, 1200, 1209, 1213, 1223, 1225, 1228, 1236, 1241, 1251, 1256, 1268, 1274, 1284, 1290, 1300] \ No newline at end of file +[4, 1, 162, 1311, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 1, 0, 5, 0, 176, 8, 0, 10, 0, 12, 0, 179, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 185, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 194, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 199, 8, 4, 10, 4, 12, 4, 202, 9, 4, 1, 4, 3, 4, 205, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 219, 8, 5, 1, 6, 1, 6, 3, 6, 223, 8, 6, 1, 6, 3, 6, 226, 8, 6, 1, 7, 1, 7, 3, 7, 230, 8, 7, 1, 7, 3, 7, 233, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 240, 8, 8, 1, 8, 1, 8, 3, 8, 244, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 251, 8, 9, 10, 9, 12, 9, 254, 9, 9, 1, 9, 1, 9, 3, 9, 258, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 267, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 275, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 282, 8, 12, 1, 12, 1, 12, 3, 12, 286, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 292, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 305, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 312, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 318, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 330, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 336, 8, 18, 10, 18, 12, 18, 339, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 350, 8, 20, 10, 20, 12, 20, 353, 9, 20, 1, 20, 3, 20, 356, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 361, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 371, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 5, 24, 383, 8, 24, 10, 24, 12, 24, 386, 9, 24, 1, 25, 3, 25, 389, 8, 25, 1, 25, 1, 25, 3, 25, 393, 8, 25, 1, 25, 3, 25, 396, 8, 25, 1, 25, 1, 25, 3, 25, 400, 8, 25, 1, 25, 3, 25, 403, 8, 25, 1, 25, 3, 25, 406, 8, 25, 1, 25, 3, 25, 409, 8, 25, 1, 25, 3, 25, 412, 8, 25, 1, 25, 1, 25, 3, 25, 416, 8, 25, 1, 25, 1, 25, 3, 25, 420, 8, 25, 1, 25, 3, 25, 423, 8, 25, 1, 25, 3, 25, 426, 8, 25, 1, 25, 3, 25, 429, 8, 25, 1, 25, 1, 25, 3, 25, 433, 8, 25, 1, 25, 3, 25, 436, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 445, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 3, 29, 451, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 470, 8, 30, 10, 30, 12, 30, 473, 9, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 489, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 506, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 512, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 518, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 529, 8, 37, 3, 37, 531, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 542, 8, 40, 1, 40, 3, 40, 545, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 551, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 559, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 565, 8, 40, 10, 40, 12, 40, 568, 9, 40, 1, 41, 3, 41, 571, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 576, 8, 41, 1, 41, 3, 41, 579, 8, 41, 1, 41, 3, 41, 582, 8, 41, 1, 41, 1, 41, 3, 41, 586, 8, 41, 1, 41, 1, 41, 3, 41, 590, 8, 41, 1, 41, 3, 41, 593, 8, 41, 3, 41, 595, 8, 41, 1, 41, 3, 41, 598, 8, 41, 1, 41, 1, 41, 3, 41, 602, 8, 41, 1, 41, 1, 41, 3, 41, 606, 8, 41, 1, 41, 3, 41, 609, 8, 41, 3, 41, 611, 8, 41, 3, 41, 613, 8, 41, 1, 42, 1, 42, 1, 42, 3, 42, 618, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 629, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 635, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 640, 8, 45, 10, 45, 12, 45, 643, 9, 45, 1, 46, 1, 46, 3, 46, 647, 8, 46, 1, 46, 1, 46, 3, 46, 651, 8, 46, 1, 46, 1, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 661, 8, 47, 3, 47, 663, 8, 47, 1, 48, 1, 48, 1, 48, 5, 48, 668, 8, 48, 10, 48, 12, 48, 671, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 3, 50, 678, 8, 50, 1, 50, 3, 50, 681, 8, 50, 1, 50, 3, 50, 684, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 703, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 717, 8, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 731, 8, 57, 10, 57, 12, 57, 734, 9, 57, 1, 57, 3, 57, 737, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 746, 8, 57, 10, 57, 12, 57, 749, 9, 57, 1, 57, 3, 57, 752, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 761, 8, 57, 10, 57, 12, 57, 764, 9, 57, 1, 57, 3, 57, 767, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 774, 8, 57, 1, 57, 1, 57, 3, 57, 778, 8, 57, 1, 58, 1, 58, 1, 58, 5, 58, 783, 8, 58, 10, 58, 12, 58, 786, 9, 58, 1, 58, 3, 58, 789, 8, 58, 1, 59, 1, 59, 1, 59, 3, 59, 794, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 801, 8, 59, 11, 59, 12, 59, 802, 1, 59, 1, 59, 3, 59, 807, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 831, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 848, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 854, 8, 59, 1, 59, 3, 59, 857, 8, 59, 1, 59, 3, 59, 860, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 870, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 876, 8, 59, 1, 59, 3, 59, 879, 8, 59, 1, 59, 3, 59, 882, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 890, 8, 59, 1, 59, 3, 59, 893, 8, 59, 1, 59, 1, 59, 3, 59, 897, 8, 59, 1, 59, 3, 59, 900, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 914, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 931, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 936, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 947, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 954, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 966, 8, 59, 1, 59, 1, 59, 3, 59, 970, 8, 59, 1, 59, 3, 59, 973, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 982, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 996, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1012, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1041, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1049, 8, 59, 5, 59, 1051, 8, 59, 10, 59, 12, 59, 1054, 9, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1060, 8, 60, 10, 60, 12, 60, 1063, 9, 60, 1, 60, 3, 60, 1066, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1073, 8, 60, 10, 60, 12, 60, 1076, 9, 60, 1, 60, 3, 60, 1079, 8, 60, 1, 60, 1, 60, 3, 60, 1083, 8, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1088, 8, 60, 1, 61, 1, 61, 1, 61, 5, 61, 1093, 8, 61, 10, 61, 12, 61, 1096, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1104, 8, 61, 10, 61, 12, 61, 1107, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1115, 8, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1122, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1135, 8, 62, 1, 63, 1, 63, 1, 63, 5, 63, 1140, 8, 63, 10, 63, 12, 63, 1143, 9, 63, 1, 63, 3, 63, 1146, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1158, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1164, 8, 65, 1, 65, 3, 65, 1167, 8, 65, 1, 66, 1, 66, 1, 66, 5, 66, 1172, 8, 66, 10, 66, 12, 66, 1175, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1186, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1192, 8, 67, 5, 67, 1194, 8, 67, 10, 67, 12, 67, 1197, 9, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1202, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 3, 69, 1209, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1216, 8, 70, 10, 70, 12, 70, 1219, 9, 70, 1, 70, 3, 70, 1222, 8, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1232, 8, 72, 3, 72, 1234, 8, 72, 1, 73, 3, 73, 1237, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1245, 8, 73, 1, 74, 1, 74, 1, 74, 3, 74, 1250, 8, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 3, 78, 1260, 8, 78, 1, 79, 1, 79, 1, 79, 3, 79, 1265, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 1277, 8, 82, 1, 83, 1, 83, 5, 83, 1281, 8, 83, 10, 83, 12, 83, 1284, 9, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1293, 8, 84, 1, 85, 1, 85, 5, 85, 1297, 8, 85, 10, 85, 12, 85, 1300, 9, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1309, 8, 86, 1, 86, 0, 3, 80, 118, 134, 87, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 0, 17, 2, 0, 32, 32, 37, 37, 2, 0, 18, 18, 77, 77, 2, 0, 46, 46, 54, 54, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 83, 83, 2, 0, 54, 54, 76, 76, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 31, 31, 52, 52, 2, 0, 74, 74, 79, 79, 3, 0, 10, 10, 53, 53, 93, 93, 2, 0, 43, 43, 56, 56, 1, 0, 110, 111, 2, 0, 121, 121, 142, 142, 7, 0, 21, 21, 40, 40, 58, 59, 73, 73, 81, 81, 100, 100, 106, 106, 19, 0, 1, 13, 15, 20, 22, 26, 28, 29, 31, 31, 33, 36, 38, 39, 41, 44, 46, 46, 48, 54, 56, 57, 61, 61, 63, 72, 74, 80, 82, 86, 88, 95, 97, 99, 101, 102, 104, 105, 4, 0, 20, 20, 31, 31, 41, 41, 51, 51, 1484, 0, 177, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 6, 188, 1, 0, 0, 0, 8, 195, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 247, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 268, 1, 0, 0, 0, 24, 276, 1, 0, 0, 0, 26, 298, 1, 0, 0, 0, 28, 313, 1, 0, 0, 0, 30, 322, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 331, 1, 0, 0, 0, 36, 333, 1, 0, 0, 0, 38, 342, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 370, 1, 0, 0, 0, 46, 376, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 388, 1, 0, 0, 0, 52, 437, 1, 0, 0, 0, 54, 440, 1, 0, 0, 0, 56, 446, 1, 0, 0, 0, 58, 450, 1, 0, 0, 0, 60, 456, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 477, 1, 0, 0, 0, 66, 480, 1, 0, 0, 0, 68, 490, 1, 0, 0, 0, 70, 493, 1, 0, 0, 0, 72, 497, 1, 0, 0, 0, 74, 530, 1, 0, 0, 0, 76, 532, 1, 0, 0, 0, 78, 535, 1, 0, 0, 0, 80, 550, 1, 0, 0, 0, 82, 612, 1, 0, 0, 0, 84, 617, 1, 0, 0, 0, 86, 628, 1, 0, 0, 0, 88, 630, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 644, 1, 0, 0, 0, 94, 662, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 672, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 685, 1, 0, 0, 0, 104, 689, 1, 0, 0, 0, 106, 693, 1, 0, 0, 0, 108, 702, 1, 0, 0, 0, 110, 716, 1, 0, 0, 0, 112, 718, 1, 0, 0, 0, 114, 777, 1, 0, 0, 0, 116, 779, 1, 0, 0, 0, 118, 940, 1, 0, 0, 0, 120, 1082, 1, 0, 0, 0, 122, 1121, 1, 0, 0, 0, 124, 1134, 1, 0, 0, 0, 126, 1136, 1, 0, 0, 0, 128, 1157, 1, 0, 0, 0, 130, 1166, 1, 0, 0, 0, 132, 1168, 1, 0, 0, 0, 134, 1185, 1, 0, 0, 0, 136, 1198, 1, 0, 0, 0, 138, 1208, 1, 0, 0, 0, 140, 1212, 1, 0, 0, 0, 142, 1223, 1, 0, 0, 0, 144, 1233, 1, 0, 0, 0, 146, 1236, 1, 0, 0, 0, 148, 1249, 1, 0, 0, 0, 150, 1251, 1, 0, 0, 0, 152, 1253, 1, 0, 0, 0, 154, 1255, 1, 0, 0, 0, 156, 1259, 1, 0, 0, 0, 158, 1264, 1, 0, 0, 0, 160, 1266, 1, 0, 0, 0, 162, 1270, 1, 0, 0, 0, 164, 1276, 1, 0, 0, 0, 166, 1278, 1, 0, 0, 0, 168, 1292, 1, 0, 0, 0, 170, 1294, 1, 0, 0, 0, 172, 1308, 1, 0, 0, 0, 174, 176, 3, 2, 1, 0, 175, 174, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 0, 0, 1, 181, 1, 1, 0, 0, 0, 182, 185, 3, 6, 3, 0, 183, 185, 3, 10, 5, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 3, 1, 0, 0, 0, 186, 187, 3, 118, 59, 0, 187, 5, 1, 0, 0, 0, 188, 189, 5, 55, 0, 0, 189, 193, 3, 158, 79, 0, 190, 191, 5, 118, 0, 0, 191, 192, 5, 125, 0, 0, 192, 194, 3, 4, 2, 0, 193, 190, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 7, 1, 0, 0, 0, 195, 200, 3, 158, 79, 0, 196, 197, 5, 119, 0, 0, 197, 199, 3, 158, 79, 0, 198, 196, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 205, 5, 119, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 9, 1, 0, 0, 0, 206, 219, 3, 12, 6, 0, 207, 219, 3, 14, 7, 0, 208, 219, 3, 18, 9, 0, 209, 219, 3, 20, 10, 0, 210, 219, 3, 22, 11, 0, 211, 219, 3, 26, 13, 0, 212, 219, 3, 24, 12, 0, 213, 219, 3, 28, 14, 0, 214, 219, 3, 30, 15, 0, 215, 219, 3, 36, 18, 0, 216, 219, 3, 32, 16, 0, 217, 219, 3, 34, 17, 0, 218, 206, 1, 0, 0, 0, 218, 207, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 209, 1, 0, 0, 0, 218, 210, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 218, 212, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 218, 214, 1, 0, 0, 0, 218, 215, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 217, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 222, 5, 75, 0, 0, 221, 223, 3, 4, 2, 0, 222, 221, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 225, 1, 0, 0, 0, 224, 226, 5, 153, 0, 0, 225, 224, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 13, 1, 0, 0, 0, 227, 229, 5, 87, 0, 0, 228, 230, 3, 4, 2, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 233, 5, 153, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 15, 1, 0, 0, 0, 234, 243, 5, 14, 0, 0, 235, 236, 5, 133, 0, 0, 236, 239, 3, 158, 79, 0, 237, 238, 5, 118, 0, 0, 238, 240, 3, 158, 79, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 5, 152, 0, 0, 242, 244, 1, 0, 0, 0, 243, 235, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 246, 3, 36, 18, 0, 246, 17, 1, 0, 0, 0, 247, 248, 5, 96, 0, 0, 248, 252, 3, 36, 18, 0, 249, 251, 3, 16, 8, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 257, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 30, 0, 0, 256, 258, 3, 36, 18, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 19, 1, 0, 0, 0, 259, 260, 5, 42, 0, 0, 260, 261, 5, 133, 0, 0, 261, 262, 3, 4, 2, 0, 262, 263, 5, 152, 0, 0, 263, 266, 3, 10, 5, 0, 264, 265, 5, 25, 0, 0, 265, 267, 3, 10, 5, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 269, 5, 103, 0, 0, 269, 270, 5, 133, 0, 0, 270, 271, 3, 4, 2, 0, 271, 272, 5, 152, 0, 0, 272, 274, 3, 10, 5, 0, 273, 275, 5, 153, 0, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 23, 1, 0, 0, 0, 276, 277, 5, 34, 0, 0, 277, 281, 5, 133, 0, 0, 278, 282, 3, 6, 3, 0, 279, 282, 3, 30, 15, 0, 280, 282, 3, 4, 2, 0, 281, 278, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 280, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 285, 5, 153, 0, 0, 284, 286, 3, 4, 2, 0, 285, 284, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 291, 5, 153, 0, 0, 288, 292, 3, 6, 3, 0, 289, 292, 3, 30, 15, 0, 290, 292, 3, 4, 2, 0, 291, 288, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 294, 5, 152, 0, 0, 294, 296, 3, 10, 5, 0, 295, 297, 5, 153, 0, 0, 296, 295, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 25, 1, 0, 0, 0, 298, 299, 5, 34, 0, 0, 299, 300, 5, 133, 0, 0, 300, 301, 5, 55, 0, 0, 301, 304, 3, 158, 79, 0, 302, 303, 5, 119, 0, 0, 303, 305, 3, 158, 79, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 5, 44, 0, 0, 307, 308, 3, 4, 2, 0, 308, 309, 5, 152, 0, 0, 309, 311, 3, 10, 5, 0, 310, 312, 5, 153, 0, 0, 311, 310, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 27, 1, 0, 0, 0, 313, 314, 7, 0, 0, 0, 314, 315, 3, 158, 79, 0, 315, 317, 5, 133, 0, 0, 316, 318, 3, 8, 4, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 5, 152, 0, 0, 320, 321, 3, 36, 18, 0, 321, 29, 1, 0, 0, 0, 322, 323, 3, 4, 2, 0, 323, 324, 5, 118, 0, 0, 324, 325, 5, 125, 0, 0, 325, 326, 3, 4, 2, 0, 326, 31, 1, 0, 0, 0, 327, 329, 3, 4, 2, 0, 328, 330, 5, 153, 0, 0, 329, 328, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 33, 1, 0, 0, 0, 331, 332, 5, 153, 0, 0, 332, 35, 1, 0, 0, 0, 333, 337, 5, 131, 0, 0, 334, 336, 3, 2, 1, 0, 335, 334, 1, 0, 0, 0, 336, 339, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 340, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 340, 341, 5, 150, 0, 0, 341, 37, 1, 0, 0, 0, 342, 343, 3, 4, 2, 0, 343, 344, 5, 118, 0, 0, 344, 345, 3, 4, 2, 0, 345, 39, 1, 0, 0, 0, 346, 351, 3, 38, 19, 0, 347, 348, 5, 119, 0, 0, 348, 350, 3, 38, 19, 0, 349, 347, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 354, 356, 5, 119, 0, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 41, 1, 0, 0, 0, 357, 361, 3, 48, 24, 0, 358, 361, 3, 50, 25, 0, 359, 361, 3, 122, 61, 0, 360, 357, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 0, 0, 1, 363, 43, 1, 0, 0, 0, 364, 371, 3, 50, 25, 0, 365, 366, 5, 133, 0, 0, 366, 367, 3, 48, 24, 0, 367, 368, 5, 152, 0, 0, 368, 371, 1, 0, 0, 0, 369, 371, 3, 162, 81, 0, 370, 364, 1, 0, 0, 0, 370, 365, 1, 0, 0, 0, 370, 369, 1, 0, 0, 0, 371, 45, 1, 0, 0, 0, 372, 377, 5, 27, 0, 0, 373, 374, 5, 98, 0, 0, 374, 377, 5, 1, 0, 0, 375, 377, 5, 47, 0, 0, 376, 372, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 376, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 3, 44, 22, 0, 379, 47, 1, 0, 0, 0, 380, 384, 3, 44, 22, 0, 381, 383, 3, 46, 23, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 49, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 389, 3, 52, 26, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 5, 82, 0, 0, 391, 393, 5, 24, 0, 0, 392, 391, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 395, 1, 0, 0, 0, 394, 396, 3, 54, 27, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 3, 116, 58, 0, 398, 400, 3, 56, 28, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 403, 3, 58, 29, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 406, 3, 62, 31, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 409, 3, 64, 32, 0, 408, 407, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 411, 1, 0, 0, 0, 410, 412, 3, 66, 33, 0, 411, 410, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 414, 5, 105, 0, 0, 414, 416, 7, 1, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 418, 5, 105, 0, 0, 418, 420, 5, 92, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 423, 3, 68, 34, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 425, 1, 0, 0, 0, 424, 426, 3, 60, 30, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 1, 0, 0, 0, 427, 429, 3, 70, 35, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 433, 3, 74, 37, 0, 431, 433, 3, 76, 38, 0, 432, 430, 1, 0, 0, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 78, 39, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 51, 1, 0, 0, 0, 437, 438, 5, 105, 0, 0, 438, 439, 3, 126, 63, 0, 439, 53, 1, 0, 0, 0, 440, 441, 5, 91, 0, 0, 441, 444, 5, 111, 0, 0, 442, 443, 5, 105, 0, 0, 443, 445, 5, 88, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 55, 1, 0, 0, 0, 446, 447, 5, 35, 0, 0, 447, 448, 3, 80, 40, 0, 448, 57, 1, 0, 0, 0, 449, 451, 7, 2, 0, 0, 450, 449, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 5, 5, 0, 0, 453, 454, 5, 50, 0, 0, 454, 455, 3, 116, 58, 0, 455, 59, 1, 0, 0, 0, 456, 457, 5, 104, 0, 0, 457, 458, 3, 158, 79, 0, 458, 459, 5, 6, 0, 0, 459, 460, 5, 133, 0, 0, 460, 461, 3, 100, 50, 0, 461, 471, 5, 152, 0, 0, 462, 463, 5, 119, 0, 0, 463, 464, 3, 158, 79, 0, 464, 465, 5, 6, 0, 0, 465, 466, 5, 133, 0, 0, 466, 467, 3, 100, 50, 0, 467, 468, 5, 152, 0, 0, 468, 470, 1, 0, 0, 0, 469, 462, 1, 0, 0, 0, 470, 473, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 61, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 475, 5, 72, 0, 0, 475, 476, 3, 118, 59, 0, 476, 63, 1, 0, 0, 0, 477, 478, 5, 102, 0, 0, 478, 479, 3, 118, 59, 0, 479, 65, 1, 0, 0, 0, 480, 481, 5, 38, 0, 0, 481, 488, 5, 11, 0, 0, 482, 483, 7, 1, 0, 0, 483, 484, 5, 133, 0, 0, 484, 485, 3, 116, 58, 0, 485, 486, 5, 152, 0, 0, 486, 489, 1, 0, 0, 0, 487, 489, 3, 116, 58, 0, 488, 482, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 67, 1, 0, 0, 0, 490, 491, 5, 39, 0, 0, 491, 492, 3, 118, 59, 0, 492, 69, 1, 0, 0, 0, 493, 494, 5, 67, 0, 0, 494, 495, 5, 11, 0, 0, 495, 496, 3, 90, 45, 0, 496, 71, 1, 0, 0, 0, 497, 498, 5, 67, 0, 0, 498, 499, 5, 11, 0, 0, 499, 500, 3, 116, 58, 0, 500, 73, 1, 0, 0, 0, 501, 502, 5, 57, 0, 0, 502, 505, 3, 118, 59, 0, 503, 504, 5, 119, 0, 0, 504, 506, 3, 118, 59, 0, 505, 503, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 511, 1, 0, 0, 0, 507, 508, 5, 105, 0, 0, 508, 512, 5, 88, 0, 0, 509, 510, 5, 11, 0, 0, 510, 512, 3, 116, 58, 0, 511, 507, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 531, 1, 0, 0, 0, 513, 514, 5, 57, 0, 0, 514, 517, 3, 118, 59, 0, 515, 516, 5, 105, 0, 0, 516, 518, 5, 88, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 64, 0, 0, 520, 521, 3, 118, 59, 0, 521, 531, 1, 0, 0, 0, 522, 523, 5, 57, 0, 0, 523, 524, 3, 118, 59, 0, 524, 525, 5, 64, 0, 0, 525, 528, 3, 118, 59, 0, 526, 527, 5, 11, 0, 0, 527, 529, 3, 116, 58, 0, 528, 526, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 531, 1, 0, 0, 0, 530, 501, 1, 0, 0, 0, 530, 513, 1, 0, 0, 0, 530, 522, 1, 0, 0, 0, 531, 75, 1, 0, 0, 0, 532, 533, 5, 64, 0, 0, 533, 534, 3, 118, 59, 0, 534, 77, 1, 0, 0, 0, 535, 536, 5, 84, 0, 0, 536, 537, 3, 96, 48, 0, 537, 79, 1, 0, 0, 0, 538, 539, 6, 40, -1, 0, 539, 541, 3, 134, 67, 0, 540, 542, 5, 29, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 545, 3, 88, 44, 0, 544, 543, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 551, 1, 0, 0, 0, 546, 547, 5, 133, 0, 0, 547, 548, 3, 80, 40, 0, 548, 549, 5, 152, 0, 0, 549, 551, 1, 0, 0, 0, 550, 538, 1, 0, 0, 0, 550, 546, 1, 0, 0, 0, 551, 566, 1, 0, 0, 0, 552, 553, 10, 3, 0, 0, 553, 554, 3, 84, 42, 0, 554, 555, 3, 80, 40, 4, 555, 565, 1, 0, 0, 0, 556, 558, 10, 4, 0, 0, 557, 559, 3, 82, 41, 0, 558, 557, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 561, 5, 50, 0, 0, 561, 562, 3, 80, 40, 0, 562, 563, 3, 86, 43, 0, 563, 565, 1, 0, 0, 0, 564, 552, 1, 0, 0, 0, 564, 556, 1, 0, 0, 0, 565, 568, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 81, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 569, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 579, 5, 46, 0, 0, 573, 575, 5, 46, 0, 0, 574, 576, 7, 3, 0, 0, 575, 574, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 579, 1, 0, 0, 0, 577, 579, 7, 3, 0, 0, 578, 570, 1, 0, 0, 0, 578, 573, 1, 0, 0, 0, 578, 577, 1, 0, 0, 0, 579, 613, 1, 0, 0, 0, 580, 582, 7, 4, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 585, 7, 5, 0, 0, 584, 586, 5, 68, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 595, 1, 0, 0, 0, 587, 589, 7, 5, 0, 0, 588, 590, 5, 68, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 593, 7, 4, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 595, 1, 0, 0, 0, 594, 581, 1, 0, 0, 0, 594, 587, 1, 0, 0, 0, 595, 613, 1, 0, 0, 0, 596, 598, 7, 6, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 601, 5, 36, 0, 0, 600, 602, 5, 68, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 611, 1, 0, 0, 0, 603, 605, 5, 36, 0, 0, 604, 606, 5, 68, 0, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 609, 7, 6, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 611, 1, 0, 0, 0, 610, 597, 1, 0, 0, 0, 610, 603, 1, 0, 0, 0, 611, 613, 1, 0, 0, 0, 612, 578, 1, 0, 0, 0, 612, 594, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 83, 1, 0, 0, 0, 614, 615, 5, 17, 0, 0, 615, 618, 5, 50, 0, 0, 616, 618, 5, 119, 0, 0, 617, 614, 1, 0, 0, 0, 617, 616, 1, 0, 0, 0, 618, 85, 1, 0, 0, 0, 619, 620, 5, 65, 0, 0, 620, 629, 3, 116, 58, 0, 621, 622, 5, 99, 0, 0, 622, 623, 5, 133, 0, 0, 623, 624, 3, 116, 58, 0, 624, 625, 5, 152, 0, 0, 625, 629, 1, 0, 0, 0, 626, 627, 5, 99, 0, 0, 627, 629, 3, 116, 58, 0, 628, 619, 1, 0, 0, 0, 628, 621, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 87, 1, 0, 0, 0, 630, 631, 5, 80, 0, 0, 631, 634, 3, 94, 47, 0, 632, 633, 5, 64, 0, 0, 633, 635, 3, 94, 47, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 89, 1, 0, 0, 0, 636, 641, 3, 92, 46, 0, 637, 638, 5, 119, 0, 0, 638, 640, 3, 92, 46, 0, 639, 637, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 91, 1, 0, 0, 0, 643, 641, 1, 0, 0, 0, 644, 646, 3, 118, 59, 0, 645, 647, 7, 7, 0, 0, 646, 645, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 649, 5, 63, 0, 0, 649, 651, 7, 8, 0, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 653, 5, 16, 0, 0, 653, 655, 5, 113, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 663, 3, 162, 81, 0, 657, 660, 3, 146, 73, 0, 658, 659, 5, 154, 0, 0, 659, 661, 3, 146, 73, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 656, 1, 0, 0, 0, 662, 657, 1, 0, 0, 0, 663, 95, 1, 0, 0, 0, 664, 669, 3, 98, 49, 0, 665, 666, 5, 119, 0, 0, 666, 668, 3, 98, 49, 0, 667, 665, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 97, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 3, 158, 79, 0, 673, 674, 5, 125, 0, 0, 674, 675, 3, 148, 74, 0, 675, 99, 1, 0, 0, 0, 676, 678, 3, 102, 51, 0, 677, 676, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 680, 1, 0, 0, 0, 679, 681, 3, 104, 52, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 684, 3, 106, 53, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 101, 1, 0, 0, 0, 685, 686, 5, 70, 0, 0, 686, 687, 5, 11, 0, 0, 687, 688, 3, 116, 58, 0, 688, 103, 1, 0, 0, 0, 689, 690, 5, 67, 0, 0, 690, 691, 5, 11, 0, 0, 691, 692, 3, 90, 45, 0, 692, 105, 1, 0, 0, 0, 693, 694, 7, 9, 0, 0, 694, 695, 3, 108, 54, 0, 695, 107, 1, 0, 0, 0, 696, 703, 3, 110, 55, 0, 697, 698, 5, 9, 0, 0, 698, 699, 3, 110, 55, 0, 699, 700, 5, 2, 0, 0, 700, 701, 3, 110, 55, 0, 701, 703, 1, 0, 0, 0, 702, 696, 1, 0, 0, 0, 702, 697, 1, 0, 0, 0, 703, 109, 1, 0, 0, 0, 704, 705, 5, 19, 0, 0, 705, 717, 5, 78, 0, 0, 706, 707, 5, 97, 0, 0, 707, 717, 5, 71, 0, 0, 708, 709, 5, 97, 0, 0, 709, 717, 5, 33, 0, 0, 710, 711, 3, 146, 73, 0, 711, 712, 5, 71, 0, 0, 712, 717, 1, 0, 0, 0, 713, 714, 3, 146, 73, 0, 714, 715, 5, 33, 0, 0, 715, 717, 1, 0, 0, 0, 716, 704, 1, 0, 0, 0, 716, 706, 1, 0, 0, 0, 716, 708, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 716, 713, 1, 0, 0, 0, 717, 111, 1, 0, 0, 0, 718, 719, 3, 118, 59, 0, 719, 720, 5, 0, 0, 1, 720, 113, 1, 0, 0, 0, 721, 778, 3, 158, 79, 0, 722, 723, 3, 158, 79, 0, 723, 724, 5, 133, 0, 0, 724, 725, 3, 158, 79, 0, 725, 732, 3, 114, 57, 0, 726, 727, 5, 119, 0, 0, 727, 728, 3, 158, 79, 0, 728, 729, 3, 114, 57, 0, 729, 731, 1, 0, 0, 0, 730, 726, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 737, 5, 119, 0, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 152, 0, 0, 739, 778, 1, 0, 0, 0, 740, 741, 3, 158, 79, 0, 741, 742, 5, 133, 0, 0, 742, 747, 3, 160, 80, 0, 743, 744, 5, 119, 0, 0, 744, 746, 3, 160, 80, 0, 745, 743, 1, 0, 0, 0, 746, 749, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 750, 752, 5, 119, 0, 0, 751, 750, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 152, 0, 0, 754, 778, 1, 0, 0, 0, 755, 756, 3, 158, 79, 0, 756, 757, 5, 133, 0, 0, 757, 762, 3, 114, 57, 0, 758, 759, 5, 119, 0, 0, 759, 761, 3, 114, 57, 0, 760, 758, 1, 0, 0, 0, 761, 764, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 767, 5, 119, 0, 0, 766, 765, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 5, 152, 0, 0, 769, 778, 1, 0, 0, 0, 770, 771, 3, 158, 79, 0, 771, 773, 5, 133, 0, 0, 772, 774, 3, 116, 58, 0, 773, 772, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 5, 152, 0, 0, 776, 778, 1, 0, 0, 0, 777, 721, 1, 0, 0, 0, 777, 722, 1, 0, 0, 0, 777, 740, 1, 0, 0, 0, 777, 755, 1, 0, 0, 0, 777, 770, 1, 0, 0, 0, 778, 115, 1, 0, 0, 0, 779, 784, 3, 118, 59, 0, 780, 781, 5, 119, 0, 0, 781, 783, 3, 118, 59, 0, 782, 780, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 782, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 787, 789, 5, 119, 0, 0, 788, 787, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 117, 1, 0, 0, 0, 790, 791, 6, 59, -1, 0, 791, 793, 5, 12, 0, 0, 792, 794, 3, 118, 59, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 800, 1, 0, 0, 0, 795, 796, 5, 101, 0, 0, 796, 797, 3, 118, 59, 0, 797, 798, 5, 86, 0, 0, 798, 799, 3, 118, 59, 0, 799, 801, 1, 0, 0, 0, 800, 795, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 25, 0, 0, 805, 807, 3, 118, 59, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 5, 26, 0, 0, 809, 941, 1, 0, 0, 0, 810, 811, 5, 13, 0, 0, 811, 812, 5, 133, 0, 0, 812, 813, 3, 118, 59, 0, 813, 814, 5, 6, 0, 0, 814, 815, 3, 114, 57, 0, 815, 816, 5, 152, 0, 0, 816, 941, 1, 0, 0, 0, 817, 818, 5, 20, 0, 0, 818, 941, 5, 113, 0, 0, 819, 820, 5, 48, 0, 0, 820, 821, 3, 118, 59, 0, 821, 822, 3, 150, 75, 0, 822, 941, 1, 0, 0, 0, 823, 824, 5, 85, 0, 0, 824, 825, 5, 133, 0, 0, 825, 826, 3, 118, 59, 0, 826, 827, 5, 35, 0, 0, 827, 830, 3, 118, 59, 0, 828, 829, 5, 34, 0, 0, 829, 831, 3, 118, 59, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 833, 5, 152, 0, 0, 833, 941, 1, 0, 0, 0, 834, 835, 5, 89, 0, 0, 835, 941, 5, 113, 0, 0, 836, 837, 5, 94, 0, 0, 837, 838, 5, 133, 0, 0, 838, 839, 7, 10, 0, 0, 839, 840, 3, 164, 82, 0, 840, 841, 5, 35, 0, 0, 841, 842, 3, 118, 59, 0, 842, 843, 5, 152, 0, 0, 843, 941, 1, 0, 0, 0, 844, 845, 3, 158, 79, 0, 845, 847, 5, 133, 0, 0, 846, 848, 3, 116, 58, 0, 847, 846, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 5, 152, 0, 0, 850, 859, 1, 0, 0, 0, 851, 853, 5, 133, 0, 0, 852, 854, 5, 24, 0, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 856, 1, 0, 0, 0, 855, 857, 3, 116, 58, 0, 856, 855, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 5, 152, 0, 0, 859, 851, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 69, 0, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 100, 50, 0, 864, 865, 5, 152, 0, 0, 865, 941, 1, 0, 0, 0, 866, 867, 3, 158, 79, 0, 867, 869, 5, 133, 0, 0, 868, 870, 3, 116, 58, 0, 869, 868, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 5, 152, 0, 0, 872, 881, 1, 0, 0, 0, 873, 875, 5, 133, 0, 0, 874, 876, 5, 24, 0, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 1, 0, 0, 0, 877, 879, 3, 116, 58, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 882, 5, 152, 0, 0, 881, 873, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 69, 0, 0, 884, 885, 3, 158, 79, 0, 885, 941, 1, 0, 0, 0, 886, 892, 3, 158, 79, 0, 887, 889, 5, 133, 0, 0, 888, 890, 3, 116, 58, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 5, 152, 0, 0, 892, 887, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 5, 133, 0, 0, 895, 897, 5, 24, 0, 0, 896, 895, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 899, 1, 0, 0, 0, 898, 900, 3, 116, 58, 0, 899, 898, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 5, 152, 0, 0, 902, 941, 1, 0, 0, 0, 903, 941, 3, 122, 61, 0, 904, 941, 3, 166, 83, 0, 905, 941, 3, 148, 74, 0, 906, 907, 5, 121, 0, 0, 907, 941, 3, 118, 59, 20, 908, 909, 5, 61, 0, 0, 909, 941, 3, 118, 59, 14, 910, 911, 3, 138, 69, 0, 911, 912, 5, 123, 0, 0, 912, 914, 1, 0, 0, 0, 913, 910, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 941, 5, 115, 0, 0, 916, 917, 5, 133, 0, 0, 917, 918, 3, 48, 24, 0, 918, 919, 5, 152, 0, 0, 919, 941, 1, 0, 0, 0, 920, 921, 5, 133, 0, 0, 921, 922, 3, 118, 59, 0, 922, 923, 5, 152, 0, 0, 923, 941, 1, 0, 0, 0, 924, 925, 5, 133, 0, 0, 925, 926, 3, 116, 58, 0, 926, 927, 5, 152, 0, 0, 927, 941, 1, 0, 0, 0, 928, 930, 5, 132, 0, 0, 929, 931, 3, 116, 58, 0, 930, 929, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 941, 5, 151, 0, 0, 933, 935, 5, 131, 0, 0, 934, 936, 3, 40, 20, 0, 935, 934, 1, 0, 0, 0, 935, 936, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 941, 5, 150, 0, 0, 938, 941, 3, 120, 60, 0, 939, 941, 3, 130, 65, 0, 940, 790, 1, 0, 0, 0, 940, 810, 1, 0, 0, 0, 940, 817, 1, 0, 0, 0, 940, 819, 1, 0, 0, 0, 940, 823, 1, 0, 0, 0, 940, 834, 1, 0, 0, 0, 940, 836, 1, 0, 0, 0, 940, 844, 1, 0, 0, 0, 940, 866, 1, 0, 0, 0, 940, 886, 1, 0, 0, 0, 940, 903, 1, 0, 0, 0, 940, 904, 1, 0, 0, 0, 940, 905, 1, 0, 0, 0, 940, 906, 1, 0, 0, 0, 940, 908, 1, 0, 0, 0, 940, 913, 1, 0, 0, 0, 940, 916, 1, 0, 0, 0, 940, 920, 1, 0, 0, 0, 940, 924, 1, 0, 0, 0, 940, 928, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 1052, 1, 0, 0, 0, 942, 946, 10, 19, 0, 0, 943, 947, 5, 115, 0, 0, 944, 947, 5, 154, 0, 0, 945, 947, 5, 141, 0, 0, 946, 943, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 1051, 3, 118, 59, 20, 949, 953, 10, 18, 0, 0, 950, 954, 5, 142, 0, 0, 951, 954, 5, 121, 0, 0, 952, 954, 5, 120, 0, 0, 953, 950, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 952, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 1051, 3, 118, 59, 19, 956, 981, 10, 17, 0, 0, 957, 982, 5, 124, 0, 0, 958, 982, 5, 125, 0, 0, 959, 982, 5, 136, 0, 0, 960, 982, 5, 134, 0, 0, 961, 982, 5, 135, 0, 0, 962, 982, 5, 126, 0, 0, 963, 982, 5, 127, 0, 0, 964, 966, 5, 61, 0, 0, 965, 964, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 969, 5, 44, 0, 0, 968, 970, 5, 15, 0, 0, 969, 968, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 982, 1, 0, 0, 0, 971, 973, 5, 61, 0, 0, 972, 971, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 982, 7, 11, 0, 0, 975, 982, 5, 148, 0, 0, 976, 982, 5, 149, 0, 0, 977, 982, 5, 138, 0, 0, 978, 982, 5, 129, 0, 0, 979, 982, 5, 130, 0, 0, 980, 982, 5, 137, 0, 0, 981, 957, 1, 0, 0, 0, 981, 958, 1, 0, 0, 0, 981, 959, 1, 0, 0, 0, 981, 960, 1, 0, 0, 0, 981, 961, 1, 0, 0, 0, 981, 962, 1, 0, 0, 0, 981, 963, 1, 0, 0, 0, 981, 965, 1, 0, 0, 0, 981, 972, 1, 0, 0, 0, 981, 975, 1, 0, 0, 0, 981, 976, 1, 0, 0, 0, 981, 977, 1, 0, 0, 0, 981, 978, 1, 0, 0, 0, 981, 979, 1, 0, 0, 0, 981, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 1051, 3, 118, 59, 18, 984, 985, 10, 15, 0, 0, 985, 986, 5, 140, 0, 0, 986, 1051, 3, 118, 59, 16, 987, 988, 10, 13, 0, 0, 988, 989, 5, 2, 0, 0, 989, 1051, 3, 118, 59, 14, 990, 991, 10, 12, 0, 0, 991, 992, 5, 66, 0, 0, 992, 1051, 3, 118, 59, 13, 993, 995, 10, 11, 0, 0, 994, 996, 5, 61, 0, 0, 995, 994, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 998, 5, 9, 0, 0, 998, 999, 3, 118, 59, 0, 999, 1000, 5, 2, 0, 0, 1000, 1001, 3, 118, 59, 12, 1001, 1051, 1, 0, 0, 0, 1002, 1003, 10, 10, 0, 0, 1003, 1004, 5, 143, 0, 0, 1004, 1005, 3, 118, 59, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 3, 118, 59, 10, 1007, 1051, 1, 0, 0, 0, 1008, 1009, 10, 30, 0, 0, 1009, 1011, 5, 133, 0, 0, 1010, 1012, 3, 116, 58, 0, 1011, 1010, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1051, 5, 152, 0, 0, 1014, 1015, 10, 26, 0, 0, 1015, 1016, 5, 132, 0, 0, 1016, 1017, 3, 118, 59, 0, 1017, 1018, 5, 151, 0, 0, 1018, 1051, 1, 0, 0, 0, 1019, 1020, 10, 25, 0, 0, 1020, 1021, 5, 123, 0, 0, 1021, 1051, 5, 111, 0, 0, 1022, 1023, 10, 24, 0, 0, 1023, 1024, 5, 123, 0, 0, 1024, 1051, 3, 158, 79, 0, 1025, 1026, 10, 23, 0, 0, 1026, 1027, 5, 139, 0, 0, 1027, 1028, 5, 132, 0, 0, 1028, 1029, 3, 118, 59, 0, 1029, 1030, 5, 151, 0, 0, 1030, 1051, 1, 0, 0, 0, 1031, 1032, 10, 22, 0, 0, 1032, 1033, 5, 139, 0, 0, 1033, 1051, 5, 111, 0, 0, 1034, 1035, 10, 21, 0, 0, 1035, 1036, 5, 139, 0, 0, 1036, 1051, 3, 158, 79, 0, 1037, 1038, 10, 16, 0, 0, 1038, 1040, 5, 49, 0, 0, 1039, 1041, 5, 61, 0, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1051, 5, 62, 0, 0, 1043, 1048, 10, 9, 0, 0, 1044, 1045, 5, 6, 0, 0, 1045, 1049, 3, 158, 79, 0, 1046, 1047, 5, 6, 0, 0, 1047, 1049, 5, 113, 0, 0, 1048, 1044, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 942, 1, 0, 0, 0, 1050, 949, 1, 0, 0, 0, 1050, 956, 1, 0, 0, 0, 1050, 984, 1, 0, 0, 0, 1050, 987, 1, 0, 0, 0, 1050, 990, 1, 0, 0, 0, 1050, 993, 1, 0, 0, 0, 1050, 1002, 1, 0, 0, 0, 1050, 1008, 1, 0, 0, 0, 1050, 1014, 1, 0, 0, 0, 1050, 1019, 1, 0, 0, 0, 1050, 1022, 1, 0, 0, 0, 1050, 1025, 1, 0, 0, 0, 1050, 1031, 1, 0, 0, 0, 1050, 1034, 1, 0, 0, 0, 1050, 1037, 1, 0, 0, 0, 1050, 1043, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 119, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 133, 0, 0, 1056, 1061, 3, 158, 79, 0, 1057, 1058, 5, 119, 0, 0, 1058, 1060, 3, 158, 79, 0, 1059, 1057, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1065, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1066, 5, 119, 0, 0, 1065, 1064, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 152, 0, 0, 1068, 1083, 1, 0, 0, 0, 1069, 1074, 3, 158, 79, 0, 1070, 1071, 5, 119, 0, 0, 1071, 1073, 3, 158, 79, 0, 1072, 1070, 1, 0, 0, 0, 1073, 1076, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1077, 1079, 5, 119, 0, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1083, 1, 0, 0, 0, 1080, 1081, 5, 133, 0, 0, 1081, 1083, 5, 152, 0, 0, 1082, 1055, 1, 0, 0, 0, 1082, 1069, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1087, 5, 114, 0, 0, 1085, 1088, 3, 118, 59, 0, 1086, 1088, 3, 36, 18, 0, 1087, 1085, 1, 0, 0, 0, 1087, 1086, 1, 0, 0, 0, 1088, 121, 1, 0, 0, 0, 1089, 1090, 5, 135, 0, 0, 1090, 1094, 3, 158, 79, 0, 1091, 1093, 3, 124, 62, 0, 1092, 1091, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 5, 154, 0, 0, 1098, 1099, 5, 127, 0, 0, 1099, 1122, 1, 0, 0, 0, 1100, 1101, 5, 135, 0, 0, 1101, 1105, 3, 158, 79, 0, 1102, 1104, 3, 124, 62, 0, 1103, 1102, 1, 0, 0, 0, 1104, 1107, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1108, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1108, 1114, 5, 127, 0, 0, 1109, 1115, 3, 122, 61, 0, 1110, 1111, 5, 131, 0, 0, 1111, 1112, 3, 118, 59, 0, 1112, 1113, 5, 150, 0, 0, 1113, 1115, 1, 0, 0, 0, 1114, 1109, 1, 0, 0, 0, 1114, 1110, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 5, 135, 0, 0, 1117, 1118, 5, 154, 0, 0, 1118, 1119, 3, 158, 79, 0, 1119, 1120, 5, 127, 0, 0, 1120, 1122, 1, 0, 0, 0, 1121, 1089, 1, 0, 0, 0, 1121, 1100, 1, 0, 0, 0, 1122, 123, 1, 0, 0, 0, 1123, 1124, 3, 158, 79, 0, 1124, 1125, 5, 125, 0, 0, 1125, 1126, 3, 164, 82, 0, 1126, 1135, 1, 0, 0, 0, 1127, 1128, 3, 158, 79, 0, 1128, 1129, 5, 125, 0, 0, 1129, 1130, 5, 131, 0, 0, 1130, 1131, 3, 118, 59, 0, 1131, 1132, 5, 150, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1135, 3, 158, 79, 0, 1134, 1123, 1, 0, 0, 0, 1134, 1127, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1135, 125, 1, 0, 0, 0, 1136, 1141, 3, 128, 64, 0, 1137, 1138, 5, 119, 0, 0, 1138, 1140, 3, 128, 64, 0, 1139, 1137, 1, 0, 0, 0, 1140, 1143, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1145, 1, 0, 0, 0, 1143, 1141, 1, 0, 0, 0, 1144, 1146, 5, 119, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 127, 1, 0, 0, 0, 1147, 1148, 3, 158, 79, 0, 1148, 1149, 5, 6, 0, 0, 1149, 1150, 5, 133, 0, 0, 1150, 1151, 3, 48, 24, 0, 1151, 1152, 5, 152, 0, 0, 1152, 1158, 1, 0, 0, 0, 1153, 1154, 3, 118, 59, 0, 1154, 1155, 5, 6, 0, 0, 1155, 1156, 3, 158, 79, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1147, 1, 0, 0, 0, 1157, 1153, 1, 0, 0, 0, 1158, 129, 1, 0, 0, 0, 1159, 1167, 3, 162, 81, 0, 1160, 1161, 3, 138, 69, 0, 1161, 1162, 5, 123, 0, 0, 1162, 1164, 1, 0, 0, 0, 1163, 1160, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1167, 3, 132, 66, 0, 1166, 1159, 1, 0, 0, 0, 1166, 1163, 1, 0, 0, 0, 1167, 131, 1, 0, 0, 0, 1168, 1173, 3, 158, 79, 0, 1169, 1170, 5, 123, 0, 0, 1170, 1172, 3, 158, 79, 0, 1171, 1169, 1, 0, 0, 0, 1172, 1175, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 133, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1176, 1177, 6, 67, -1, 0, 1177, 1186, 3, 138, 69, 0, 1178, 1186, 3, 136, 68, 0, 1179, 1180, 5, 133, 0, 0, 1180, 1181, 3, 48, 24, 0, 1181, 1182, 5, 152, 0, 0, 1182, 1186, 1, 0, 0, 0, 1183, 1186, 3, 122, 61, 0, 1184, 1186, 3, 162, 81, 0, 1185, 1176, 1, 0, 0, 0, 1185, 1178, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1184, 1, 0, 0, 0, 1186, 1195, 1, 0, 0, 0, 1187, 1191, 10, 3, 0, 0, 1188, 1192, 3, 156, 78, 0, 1189, 1190, 5, 6, 0, 0, 1190, 1192, 3, 158, 79, 0, 1191, 1188, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1187, 1, 0, 0, 0, 1194, 1197, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1195, 1196, 1, 0, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1195, 1, 0, 0, 0, 1198, 1199, 3, 158, 79, 0, 1199, 1201, 5, 133, 0, 0, 1200, 1202, 3, 140, 70, 0, 1201, 1200, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 5, 152, 0, 0, 1204, 137, 1, 0, 0, 0, 1205, 1206, 3, 142, 71, 0, 1206, 1207, 5, 123, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1205, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 3, 158, 79, 0, 1211, 139, 1, 0, 0, 0, 1212, 1217, 3, 118, 59, 0, 1213, 1214, 5, 119, 0, 0, 1214, 1216, 3, 118, 59, 0, 1215, 1213, 1, 0, 0, 0, 1216, 1219, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1221, 1, 0, 0, 0, 1219, 1217, 1, 0, 0, 0, 1220, 1222, 5, 119, 0, 0, 1221, 1220, 1, 0, 0, 0, 1221, 1222, 1, 0, 0, 0, 1222, 141, 1, 0, 0, 0, 1223, 1224, 3, 158, 79, 0, 1224, 143, 1, 0, 0, 0, 1225, 1234, 5, 109, 0, 0, 1226, 1227, 5, 123, 0, 0, 1227, 1234, 7, 12, 0, 0, 1228, 1229, 5, 111, 0, 0, 1229, 1231, 5, 123, 0, 0, 1230, 1232, 7, 12, 0, 0, 1231, 1230, 1, 0, 0, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1234, 1, 0, 0, 0, 1233, 1225, 1, 0, 0, 0, 1233, 1226, 1, 0, 0, 0, 1233, 1228, 1, 0, 0, 0, 1234, 145, 1, 0, 0, 0, 1235, 1237, 7, 13, 0, 0, 1236, 1235, 1, 0, 0, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1244, 1, 0, 0, 0, 1238, 1245, 3, 144, 72, 0, 1239, 1245, 5, 110, 0, 0, 1240, 1245, 5, 111, 0, 0, 1241, 1245, 5, 112, 0, 0, 1242, 1245, 5, 45, 0, 0, 1243, 1245, 5, 60, 0, 0, 1244, 1238, 1, 0, 0, 0, 1244, 1239, 1, 0, 0, 0, 1244, 1240, 1, 0, 0, 0, 1244, 1241, 1, 0, 0, 0, 1244, 1242, 1, 0, 0, 0, 1244, 1243, 1, 0, 0, 0, 1245, 147, 1, 0, 0, 0, 1246, 1250, 3, 146, 73, 0, 1247, 1250, 5, 113, 0, 0, 1248, 1250, 5, 62, 0, 0, 1249, 1246, 1, 0, 0, 0, 1249, 1247, 1, 0, 0, 0, 1249, 1248, 1, 0, 0, 0, 1250, 149, 1, 0, 0, 0, 1251, 1252, 7, 14, 0, 0, 1252, 151, 1, 0, 0, 0, 1253, 1254, 7, 15, 0, 0, 1254, 153, 1, 0, 0, 0, 1255, 1256, 7, 16, 0, 0, 1256, 155, 1, 0, 0, 0, 1257, 1260, 5, 108, 0, 0, 1258, 1260, 3, 154, 77, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1258, 1, 0, 0, 0, 1260, 157, 1, 0, 0, 0, 1261, 1265, 5, 108, 0, 0, 1262, 1265, 3, 150, 75, 0, 1263, 1265, 3, 152, 76, 0, 1264, 1261, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1263, 1, 0, 0, 0, 1265, 159, 1, 0, 0, 0, 1266, 1267, 3, 164, 82, 0, 1267, 1268, 5, 125, 0, 0, 1268, 1269, 3, 146, 73, 0, 1269, 161, 1, 0, 0, 0, 1270, 1271, 5, 131, 0, 0, 1271, 1272, 3, 118, 59, 0, 1272, 1273, 5, 150, 0, 0, 1273, 163, 1, 0, 0, 0, 1274, 1277, 5, 113, 0, 0, 1275, 1277, 3, 166, 83, 0, 1276, 1274, 1, 0, 0, 0, 1276, 1275, 1, 0, 0, 0, 1277, 165, 1, 0, 0, 0, 1278, 1282, 5, 145, 0, 0, 1279, 1281, 3, 168, 84, 0, 1280, 1279, 1, 0, 0, 0, 1281, 1284, 1, 0, 0, 0, 1282, 1280, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1282, 1, 0, 0, 0, 1285, 1286, 5, 147, 0, 0, 1286, 167, 1, 0, 0, 0, 1287, 1288, 5, 160, 0, 0, 1288, 1289, 3, 118, 59, 0, 1289, 1290, 5, 150, 0, 0, 1290, 1293, 1, 0, 0, 0, 1291, 1293, 5, 159, 0, 0, 1292, 1287, 1, 0, 0, 0, 1292, 1291, 1, 0, 0, 0, 1293, 169, 1, 0, 0, 0, 1294, 1298, 5, 146, 0, 0, 1295, 1297, 3, 172, 86, 0, 1296, 1295, 1, 0, 0, 0, 1297, 1300, 1, 0, 0, 0, 1298, 1296, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1301, 1, 0, 0, 0, 1300, 1298, 1, 0, 0, 0, 1301, 1302, 5, 0, 0, 1, 1302, 171, 1, 0, 0, 0, 1303, 1304, 5, 162, 0, 0, 1304, 1305, 3, 118, 59, 0, 1305, 1306, 5, 150, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1309, 5, 161, 0, 0, 1308, 1303, 1, 0, 0, 0, 1308, 1307, 1, 0, 0, 0, 1309, 173, 1, 0, 0, 0, 168, 177, 184, 193, 200, 204, 218, 222, 225, 229, 232, 239, 243, 252, 257, 266, 274, 281, 285, 291, 296, 304, 311, 317, 329, 337, 351, 355, 360, 370, 376, 384, 388, 392, 395, 399, 402, 405, 408, 411, 415, 419, 422, 425, 428, 432, 435, 444, 450, 471, 488, 505, 511, 517, 528, 530, 541, 544, 550, 558, 564, 566, 570, 575, 578, 581, 585, 589, 592, 594, 597, 601, 605, 608, 610, 612, 617, 628, 634, 641, 646, 650, 654, 660, 662, 669, 677, 680, 683, 702, 716, 732, 736, 747, 751, 762, 766, 773, 777, 784, 788, 793, 802, 806, 830, 847, 853, 856, 859, 869, 875, 878, 881, 889, 892, 896, 899, 913, 930, 935, 940, 946, 953, 965, 969, 972, 981, 995, 1011, 1040, 1048, 1050, 1052, 1061, 1065, 1074, 1078, 1082, 1087, 1094, 1105, 1114, 1121, 1134, 1141, 1145, 1157, 1163, 1166, 1173, 1185, 1191, 1195, 1201, 1208, 1217, 1221, 1231, 1233, 1236, 1244, 1249, 1259, 1264, 1276, 1282, 1292, 1298, 1308] \ No newline at end of file diff --git a/hogql_parser/HogQLParser.tokens b/hogql_parser/HogQLParser.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/hogql_parser/HogQLParser.tokens +++ b/hogql_parser/HogQLParser.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/hogql_parser/HogQLParserBaseVisitor.h b/hogql_parser/HogQLParserBaseVisitor.h index 80b4d5d487765..59f4a7883406e 100644 --- a/hogql_parser/HogQLParserBaseVisitor.h +++ b/hogql_parser/HogQLParserBaseVisitor.h @@ -103,11 +103,15 @@ class HogQLParserBaseVisitor : public HogQLParserVisitor { return visitChildren(ctx); } - virtual std::any visitSelectUnionStmt(HogQLParser::SelectUnionStmtContext *ctx) override { + virtual std::any visitSelectStmtWithParens(HogQLParser::SelectStmtWithParensContext *ctx) override { return visitChildren(ctx); } - virtual std::any visitSelectStmtWithParens(HogQLParser::SelectStmtWithParensContext *ctx) override { + virtual std::any visitSubsequentSelectSetClause(HogQLParser::SubsequentSelectSetClauseContext *ctx) override { + return visitChildren(ctx); + } + + virtual std::any visitSelectSetStmt(HogQLParser::SelectSetStmtContext *ctx) override { return visitChildren(ctx); } diff --git a/hogql_parser/HogQLParserVisitor.h b/hogql_parser/HogQLParserVisitor.h index 0b9e1797ad836..7e1728b26a1de 100644 --- a/hogql_parser/HogQLParserVisitor.h +++ b/hogql_parser/HogQLParserVisitor.h @@ -63,10 +63,12 @@ class HogQLParserVisitor : public antlr4::tree::AbstractParseTreeVisitor { virtual std::any visitSelect(HogQLParser::SelectContext *context) = 0; - virtual std::any visitSelectUnionStmt(HogQLParser::SelectUnionStmtContext *context) = 0; - virtual std::any visitSelectStmtWithParens(HogQLParser::SelectStmtWithParensContext *context) = 0; + virtual std::any visitSubsequentSelectSetClause(HogQLParser::SubsequentSelectSetClauseContext *context) = 0; + + virtual std::any visitSelectSetStmt(HogQLParser::SelectSetStmtContext *context) = 0; + virtual std::any visitSelectStmt(HogQLParser::SelectStmtContext *context) = 0; virtual std::any visitWithClause(HogQLParser::WithClauseContext *context) = 0; diff --git a/hogql_parser/__init__.pyi b/hogql_parser/__init__.pyi index 69734c92cc41f..e36c09e629fba 100644 --- a/hogql_parser/__init__.pyi +++ b/hogql_parser/__init__.pyi @@ -1,4 +1,4 @@ -from posthog.hogql.ast import SelectQuery, SelectUnionQuery, Program +from posthog.hogql.ast import SelectQuery, SelectSetQuery, Program from posthog.hogql.base import AST def parse_expr(expr: str, /, *, is_internal: bool = False) -> AST: @@ -15,7 +15,7 @@ def parse_order_expr(expr: str, /, *, is_internal: bool = False) -> AST: """ ... -def parse_select(expr: str, /, *, is_internal: bool = False) -> SelectQuery | SelectUnionQuery: +def parse_select(expr: str, /, *, is_internal: bool = False) -> SelectQuery | SelectSetQuery: """Parse the HogQL SELECT statement string into an AST. If the expr `is_internal`, spans and notices won't be included in the AST. diff --git a/hogql_parser/parser.cpp b/hogql_parser/parser.cpp index 128f7006db93b..177b4ec72b4b0 100644 --- a/hogql_parser/parser.cpp +++ b/hogql_parser/parser.cpp @@ -827,9 +827,9 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { // HogQL rules VISIT(Select) { - auto select_union_stmt_ctx = ctx->selectUnionStmt(); - if (select_union_stmt_ctx) { - return visit(select_union_stmt_ctx); + auto select_set_stmt_ctx = ctx->selectSetStmt(); + if (select_set_stmt_ctx) { + return visit(select_set_stmt_ctx); } auto select_stmt_ctx = ctx->selectStmt(); @@ -851,68 +851,48 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { return visitAsPyObject(placeholder_ctx); } - return visit(ctx->selectUnionStmt()); + return visit(ctx->selectSetStmt()); } - VISIT(SelectUnionStmt) { - // Using a vector of PyObjects atypically here, because this is a precursor of flattened_queries - vector select_queries; - auto select_stmt_with_parens_ctxs = ctx->selectStmtWithParens(); - select_queries.reserve(select_stmt_with_parens_ctxs.size()); - for (auto select_stmt_with_parens_ctx : select_stmt_with_parens_ctxs) { - try { - select_queries.push_back(visitAsPyObject(select_stmt_with_parens_ctx)); - } catch (...) { - X_Py_DECREF_ALL(select_queries); - throw; - } - } - PyObject* flattened_queries = PyList_New(0); - if (!flattened_queries) { - X_Py_DECREF_ALL(select_queries); + VISIT(SelectSetStmt) { + PyObject* initial_query = visitAsPyObject(ctx->selectStmtWithParens()); + PyObject* select_query = NULL; + PyObject* select_queries = PyList_New(0); + if (!select_queries) { throw PyInternalError(); } - for (auto query : select_queries) { - int is_select_query = is_ast_node_instance(query, "SelectQuery"); - if (is_select_query == -1) goto select_queries_loop_py_error; - if (is_ast_node_instance(query, "SelectQuery")) { - int append_code = PyList_Append(flattened_queries, query); - if (append_code == -1) goto select_queries_loop_py_error; - } else if (is_ast_node_instance(query, "SelectUnionQuery")) { - // Extend flattened_queries with sub_select_queries - PyObject* sub_select_queries = PyObject_GetAttrString(query, "select_queries"); - if (!sub_select_queries) goto select_queries_loop_py_error; - int extend_code = X_PyList_Extend(flattened_queries, sub_select_queries); - if (extend_code == -1) goto select_queries_loop_py_error; - Py_DECREF(sub_select_queries); - } else if (is_ast_node_instance(query, "Placeholder")) { - int append_code = PyList_Append(flattened_queries, query); - if (append_code == -1) goto select_queries_loop_py_error; - } else { - Py_DECREF(flattened_queries); - X_Py_DECREF_ALL(select_queries); - throw ParsingError("Unexpected query node type: " + string(Py_TYPE(query)->tp_name)); + + try { + for (auto subsequent : ctx->subsequentSelectSetClause()) { + char* set_operator; + if (subsequent->UNION() && subsequent->ALL()) { + set_operator = "UNION ALL"; + } else if (subsequent->INTERSECT()) { + set_operator = "INTERSECT"; + } else if (subsequent->EXCEPT()) { + set_operator = "EXCEPT"; + } else { + throw SyntaxError("Set operator must be one of UNION ALL, INTERSECT, and EXCEPT"); + } + select_query = visitAsPyObject(subsequent->selectStmtWithParens()); + PyObject* query = build_ast_node("SelectSetNode", "{s:N,s:N}", "select_query", select_query, "set_operator", PyUnicode_FromString(set_operator)); + if (!query) { + throw PyInternalError(); + } + PyList_Append(select_queries, query); } + } catch (...) { + Py_DECREF(select_queries); + Py_DECREF(initial_query); + throw; } - goto select_queries_loop_success; - select_queries_loop_py_error: - X_Py_DECREF_ALL(select_queries); - Py_DECREF(flattened_queries); - throw PyInternalError(); - select_queries_loop_success: - X_Py_DECREF_ALL(select_queries); - Py_ssize_t flattened_queries_size = PyList_Size(flattened_queries); - if (flattened_queries_size == -1) { - Py_DECREF(flattened_queries); - throw PyInternalError(); - } - if (flattened_queries_size == 1) { - PyObject* query = PyList_GET_ITEM(flattened_queries, 0); - Py_INCREF(query); - Py_DECREF(flattened_queries); - return query; + + if (PyList_Size(select_queries) == 0) { + Py_DECREF(select_queries); + return initial_query; } - RETURN_NEW_AST_NODE("SelectUnionQuery", "{s:N}", "select_queries", flattened_queries); + + RETURN_NEW_AST_NODE("SelectSetQuery", "{s:N, s:N}", "initial_select_query", initial_query, "subsequent_select_queries", select_queries); } VISIT(SelectStmt) { @@ -1632,7 +1612,7 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { RETURN_NEW_AST_NODE("ArithmeticOperation", "{s:N,s:N,s:N}", "left", left, "right", right, "op", op); } - VISIT(ColumnExprSubquery) { return visit(ctx->selectUnionStmt()); } + VISIT(ColumnExprSubquery) { return visit(ctx->selectSetStmt()); } VISIT(ColumnExprArray) { RETURN_NEW_AST_NODE("Array", "{s:N}", "exprs", visitAsPyObjectOrEmptyList(ctx->columnExprList())); @@ -2286,7 +2266,7 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { VISIT(WithExprSubquery) { string name = visitAsString(ctx->identifier()); RETURN_NEW_AST_NODE( - "CTE", "{s:s#,s:N,s:s}", "name", name.data(), name.size(), "expr", visitAsPyObject(ctx->selectUnionStmt()), + "CTE", "{s:s#,s:N,s:s}", "name", name.data(), name.size(), "expr", visitAsPyObject(ctx->selectSetStmt()), "cte_type", "subquery" ); } @@ -2332,7 +2312,7 @@ class HogQLParseTreeConverter : public HogQLParserBaseVisitor { RETURN_NEW_AST_NODE("Field", "{s:N}", "chain", X_PyList_FromStrings(chain)); } - VISIT(TableExprSubquery) { return visit(ctx->selectUnionStmt()); } + VISIT(TableExprSubquery) { return visit(ctx->selectSetStmt()); } VISIT(TableExprPlaceholder) { return visitAsPyObject(ctx->placeholder()); } diff --git a/hogql_parser/setup.py b/hogql_parser/setup.py index bd336c6fa6654..dd38c3371fb47 100644 --- a/hogql_parser/setup.py +++ b/hogql_parser/setup.py @@ -32,7 +32,7 @@ setup( name="hogql_parser", - version="1.0.45", + version="1.0.46", url="https://github.com/PostHog/posthog/tree/master/hogql_parser", author="PostHog Inc.", author_email="hey@posthog.com", diff --git a/mypy-baseline.txt b/mypy-baseline.txt index 57a7e095f6298..86c1857ca8e31 100644 --- a/mypy-baseline.txt +++ b/mypy-baseline.txt @@ -88,10 +88,10 @@ posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "OrderExpr", variable has type "CTE") [assignment] posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "CTE") [assignment] posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "WindowExpr", variable has type "CTE") [assignment] -posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "FieldAliasType", variable has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] -posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "Type", variable has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] +posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "FieldAliasType", variable has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] +posthog/hogql/visitor.py:0: error: Incompatible types in assignment (expression has type "Type", variable has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType") [assignment] posthog/models/filters/mixins/simplify.py:0: error: Incompatible type for lookup 'pk': (got "str | int | list[str]", expected "str | int") [misc] -posthog/hogql/resolver_utils.py:0: error: Argument 1 to "lookup_field_by_name" has incompatible type "SelectQueryType | SelectUnionQueryType"; expected "SelectQueryType" [arg-type] +posthog/hogql/resolver_utils.py:0: error: Argument 1 to "lookup_field_by_name" has incompatible type "SelectQueryType | SelectSetQueryType"; expected "SelectQueryType" [arg-type] posthog/helpers/dashboard_templates.py:0: error: Incompatible types in assignment (expression has type "str | None", variable has type "str | Combinable") [assignment] posthog/hogql/parser.py:0: error: Item "None" of "list[Expr] | None" has no attribute "__iter__" (not iterable) [union-attr] posthog/hogql/parser.py:0: error: "None" has no attribute "text" [attr-defined] @@ -161,23 +161,22 @@ posthog/hogql_queries/utils/query_date_range.py:0: error: Incompatible default f posthog/hogql_queries/utils/query_date_range.py:0: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True posthog/hogql_queries/utils/query_date_range.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase posthog/hogql_queries/utils/query_date_range.py:0: error: Item "None" of "IntervalType | None" has no attribute "name" [union-attr] -posthog/hogql/resolver.py:0: error: List comprehension has incompatible type List[SelectQueryType | None]; expected List[SelectQueryType] [misc] posthog/hogql/resolver.py:0: error: Need type annotation for "columns_with_visible_alias" (hint: "columns_with_visible_alias: dict[, ] = ...") [var-annotated] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] -posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectUnionQuery | Field | None") [assignment] +posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectSetQuery | Field | None") [assignment] posthog/hogql/resolver.py:0: error: Item "None" of "Database | None" has no attribute "get_table" [union-attr] posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "TableType", variable has type "LazyTableType") [assignment] posthog/hogql/resolver.py:0: error: Argument "table_type" to "TableAliasType" has incompatible type "LazyTableType"; expected "TableType" [arg-type] posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "LazyTableType", variable has type "TableAliasType") [assignment] -posthog/hogql/resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectUnionQuery | Field | None"; expected "Expr" [arg-type] +posthog/hogql/resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectSetQuery | Field | None"; expected "Expr" [arg-type] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] posthog/hogql/resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "join_type" [union-attr] -posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectViewType" has incompatible type "SelectQueryType | None"; expected "SelectQueryType | SelectUnionQueryType" [arg-type] -posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectUnionQuery | Field | None" has no attribute "type" [union-attr] -posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectQueryAliasType" has incompatible type "Type | Any | None"; expected "SelectQueryType | SelectUnionQueryType" [arg-type] -posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectUnionQuery | Field | None" has no attribute "type" [union-attr] -posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Type | Any | None", variable has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None") [assignment] -posthog/hogql/resolver.py:0: error: Argument 1 to "append" of "list" has incompatible type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None"; expected "SelectQueryType | SelectUnionQueryType" [arg-type] +posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectViewType" has incompatible type "SelectQueryType | None"; expected "SelectQueryType | SelectSetQueryType" [arg-type] +posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectSetQuery | Field | None" has no attribute "type" [union-attr] +posthog/hogql/resolver.py:0: error: Argument "select_query_type" to "SelectQueryAliasType" has incompatible type "Type | Any | None"; expected "SelectQueryType | SelectSetQueryType" [arg-type] +posthog/hogql/resolver.py:0: error: Item "None" of "SelectQuery | SelectSetQuery | Field | None" has no attribute "type" [union-attr] +posthog/hogql/resolver.py:0: error: Incompatible types in assignment (expression has type "Type | Any | None", variable has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None") [assignment] +posthog/hogql/resolver.py:0: error: Argument 1 to "append" of "list" has incompatible type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType | None"; expected "SelectQueryType | SelectSetQueryType" [arg-type] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] posthog/hogql/resolver.py:0: error: Statement is unreachable [unreachable] posthog/hogql/resolver.py:0: error: Item "None" of "Type | None" has no attribute "resolve_constant_type" [union-attr] @@ -193,12 +192,12 @@ posthog/hogql_queries/insights/trends/aggregation_operations.py:0: note: "List" posthog/hogql_queries/insights/trends/aggregation_operations.py:0: note: Consider using "Sequence" instead, which is covariant posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: List item 1 has incompatible type "str | None"; expected "str" [list-item] posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Argument "chain" to "Field" has incompatible type "list[str | int] | list[str]"; expected "list[str | int]" [arg-type] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "group_by" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "group_by" [union-attr] posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "None" of "list[Expr] | None" has no attribute "append" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "group_by" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "group_by" [union-attr] posthog/hogql_queries/insights/trends/aggregation_operations.py:0: error: Item "None" of "list[Expr] | Any | None" has no attribute "append" [union-attr] posthog/hogql/transforms/lazy_tables.py:0: error: Incompatible types in assignment (expression has type "dict[Never, Never]", variable has type "list[ConstraintOverride]") [assignment] posthog/hogql/transforms/lazy_tables.py:0: error: Non-overlapping equality check (left operand type: "TableType", right operand type: "LazyTableType") [comparison-overlap] @@ -206,7 +205,7 @@ posthog/hogql/transforms/lazy_tables.py:0: error: Non-overlapping equality check posthog/hogql/transforms/lazy_tables.py:0: error: Name "chain" already defined on line 0 [no-redef] posthog/hogql/transforms/lazy_tables.py:0: error: Subclass of "TableType" and "LazyTableType" cannot exist: would have incompatible method signatures [unreachable] posthog/hogql/transforms/lazy_tables.py:0: error: Statement is unreachable [unreachable] -posthog/hogql/transforms/lazy_tables.py:0: error: Incompatible types in assignment (expression has type "BaseTableType | SelectUnionQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType", variable has type "SelectQueryAliasType | None") [assignment] +posthog/hogql/transforms/lazy_tables.py:0: error: Incompatible types in assignment (expression has type "BaseTableType | SelectSetQueryType | SelectQueryType | SelectQueryAliasType | SelectViewType", variable has type "SelectQueryAliasType | None") [assignment] posthog/hogql/transforms/in_cohort.py:0: error: Incompatible default for argument "context" (default has type "None", argument has type "HogQLContext") [assignment] posthog/hogql/transforms/in_cohort.py:0: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True posthog/hogql/transforms/in_cohort.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase @@ -217,7 +216,7 @@ posthog/hogql/transforms/in_cohort.py:0: note: PEP 484 prohibits implicit Option posthog/hogql/transforms/in_cohort.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase posthog/hogql/transforms/in_cohort.py:0: error: Incompatible type for lookup 'team_id': (got "int | None", expected "str | int") [misc] posthog/hogql/transforms/in_cohort.py:0: error: Incompatible type for lookup 'team_id': (got "int | None", expected "str | int") [misc] -posthog/hogql/transforms/in_cohort.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Expr"; expected "SelectQuery | SelectUnionQuery | Field | None" [arg-type] +posthog/hogql/transforms/in_cohort.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Expr"; expected "SelectQuery | SelectSetQuery | Field | None" [arg-type] posthog/hogql/transforms/in_cohort.py:0: error: List item 0 has incompatible type "SelectQueryType | None"; expected "SelectQueryType" [list-item] posthog/hogql/transforms/in_cohort.py:0: error: Item "None" of "JoinConstraint | None" has no attribute "expr" [union-attr] posthog/hogql/transforms/in_cohort.py:0: error: Item "Expr" of "Expr | Any" has no attribute "left" [union-attr] @@ -332,17 +331,16 @@ posthog/hogql/filters.py:0: error: Incompatible default for argument "team" (def posthog/hogql/filters.py:0: note: PEP 484 prohibits implicit Optional. Accordingly, mypy has changed its default to no_implicit_optional=True posthog/hogql/filters.py:0: note: Use https://github.com/hauntsaninja/no_implicit_optional to automatically upgrade your codebase posthog/api/organization.py:0: error: Incompatible return value type (got "int | None", expected "Level | None") [return-value] -posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str | SelectQuery | SelectUnionQuery") [assignment] -posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectUnionQuery") [assignment] +posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "None", variable has type "str | SelectQuery | SelectSetQuery") [assignment] +posthog/hogql/query.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "SelectQuery | SelectSetQuery") [assignment] posthog/hogql/query.py:0: error: Argument 1 to "get_default_limit_for_context" has incompatible type "LimitContext | None"; expected "LimitContext" [arg-type] -posthog/hogql/query.py:0: error: "SelectQuery" has no attribute "select_queries" [attr-defined] -posthog/hogql/query.py:0: error: Subclass of "SelectQuery" and "SelectUnionQuery" cannot exist: would have incompatible method signatures [unreachable] +posthog/hogql/query.py:0: error: Subclass of "SelectQuery" and "SelectSetQuery" cannot exist: would have incompatible method signatures [unreachable] posthog/queries/person_query.py:0: error: Incompatible type for lookup 'pk': (got "str | int | list[str]", expected "str | int") [misc] posthog/api/action.py:0: error: Argument 1 to has incompatible type "*tuple[str, ...]"; expected "type[BaseRenderer]" [arg-type] posthog/queries/event_query/event_query.py:0: error: Incompatible type for lookup 'pk': (got "str | int | list[str]", expected "str | int") [misc] posthog/hogql_queries/sessions_timeline_query_runner.py:0: error: Statement is unreachable [unreachable] posthog/hogql_queries/hogql_query_runner.py:0: error: Statement is unreachable [unreachable] -posthog/hogql_queries/hogql_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectUnionQuery", expected "SelectQuery") [return-value] +posthog/hogql_queries/hogql_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectSetQuery", expected "SelectQuery") [return-value] posthog/hogql_queries/events_query_runner.py:0: error: Statement is unreachable [unreachable] posthog/queries/breakdown_props.py:0: error: Argument 1 to "translate_hogql" has incompatible type "str | int"; expected "str" [arg-type] posthog/queries/breakdown_props.py:0: error: Incompatible type for lookup 'pk': (got "str | None", expected "str | int") [misc] @@ -386,15 +384,15 @@ posthog/hogql_queries/insights/stickiness_query_runner.py:0: error: Module "djan posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "None" of "JoinExpr | None" has no attribute "sample" [union-attr] posthog/hogql_queries/insights/retention_query_runner.py:0: error: Unsupported operand types for - ("int" and "None") [operator] posthog/hogql_queries/insights/retention_query_runner.py:0: note: Right operand is of type "int | None" -posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select" [union-attr] -posthog/hogql_queries/insights/retention_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectUnionQuery", expected "SelectQuery") [return-value] +posthog/hogql_queries/insights/retention_query_runner.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select" [union-attr] +posthog/hogql_queries/insights/retention_query_runner.py:0: error: Incompatible return value type (got "SelectQuery | SelectSetQuery", expected "SelectQuery") [return-value] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "Constant") [assignment] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Incompatible types in assignment (expression has type "Expr", variable has type "Constant") [assignment] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Argument "exprs" to "And" has incompatible type "list[CompareOperation]"; expected "list[Expr]" [arg-type] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: note: "List" is invariant -- see https://mypy.readthedocs.io/en/stable/common_issues.html#variance posthog/hogql_queries/insights/lifecycle_query_runner.py:0: note: Consider using "Sequence" instead, which is covariant -posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "select_from" [union-attr] +posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "select_from" [union-attr] posthog/hogql_queries/insights/lifecycle_query_runner.py:0: error: Item "None" of "JoinExpr | Any | None" has no attribute "sample" [union-attr] posthog/hogql_queries/insights/funnels/funnels_query_runner.py:0: error: Module "django.utils.timezone" does not explicitly export attribute "datetime" [attr-defined] posthog/api/survey.py:0: error: Incompatible types in assignment (expression has type "Any | Sequence[Any] | None", variable has type "Survey | None") [assignment] @@ -503,19 +501,19 @@ posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinConstraint | A posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "next_join" [union-attr] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | Any | None" has no attribute "constraint" [union-attr] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinConstraint | Any | None" has no attribute "constraint_type" [union-attr] -posthog/hogql/test/test_resolver.py:0: error: Item "SelectUnionQueryType" of "SelectQueryType | SelectUnionQueryType | None" has no attribute "columns" [union-attr] -posthog/hogql/test/test_resolver.py:0: error: Item "None" of "SelectQueryType | SelectUnionQueryType | None" has no attribute "columns" [union-attr] +posthog/hogql/test/test_resolver.py:0: error: Item "SelectSetQueryType" of "SelectQueryType | SelectSetQueryType | None" has no attribute "columns" [union-attr] +posthog/hogql/test/test_resolver.py:0: error: Item "None" of "SelectQueryType | SelectSetQueryType | None" has no attribute "columns" [union-attr] posthog/hogql/test/test_resolver.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/hogql/test/test_resolver.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/hogql/test/test_resolver.py:0: error: "FieldOrTable" has no attribute "fields" [attr-defined] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] -posthog/hogql/test/test_resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectUnionQuery | Field | Any | None"; expected "Expr" [arg-type] +posthog/hogql/test/test_resolver.py:0: error: Argument 1 to "clone_expr" has incompatible type "SelectQuery | SelectSetQuery | Field | Any | None"; expected "Expr" [arg-type] posthog/hogql/test/test_resolver.py:0: error: Item "None" of "JoinExpr | None" has no attribute "alias" [union-attr] posthog/hogql/test/test_property.py:0: error: Argument 1 to "_property_to_expr" of "TestProperty" has incompatible type "HogQLPropertyFilter"; expected "PropertyGroup | Property | dict[Any, Any] | list[Any]" [arg-type] posthog/hogql/test/test_printer.py:0: error: Argument 2 to "Database" has incompatible type "int"; expected "WeekStartDay | None" [arg-type] posthog/hogql/test/test_printer.py:0: error: Argument 2 to "Database" has incompatible type "int"; expected "WeekStartDay | None" [arg-type] -posthog/hogql/test/test_printer.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "settings" [union-attr] -posthog/hogql/test/test_printer.py:0: error: Item "SelectUnionQuery" of "SelectQuery | SelectUnionQuery" has no attribute "settings" [union-attr] +posthog/hogql/test/test_printer.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "settings" [union-attr] +posthog/hogql/test/test_printer.py:0: error: Item "SelectSetQuery" of "SelectQuery | SelectSetQuery" has no attribute "settings" [union-attr] posthog/hogql/test/test_printer.py:0: error: "TestPrinter" has no attribute "snapshot" [attr-defined] posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] @@ -531,7 +529,7 @@ posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type fo posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] posthog/hogql/test/test_modifiers.py:0: error: Unsupported right operand type for in ("str | None") [operator] posthog/hogql/test/_test_parser.py:0: error: Invalid base class [misc] -posthog/hogql/test/_test_parser.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Placeholder"; expected "SelectQuery | SelectUnionQuery | Field | None" [arg-type] +posthog/hogql/test/_test_parser.py:0: error: Argument "table" to "JoinExpr" has incompatible type "Placeholder"; expected "SelectQuery | SelectSetQuery | Field | None" [arg-type] posthog/hogql/test/_test_parser.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] posthog/hogql/test/_test_parser.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] posthog/hogql/test/_test_parser.py:0: error: Item "None" of "JoinExpr | None" has no attribute "table" [union-attr] diff --git a/plugin-server/src/config/kafka-topics.ts b/plugin-server/src/config/kafka-topics.ts index d7ea527904477..8610bf8f0b819 100644 --- a/plugin-server/src/config/kafka-topics.ts +++ b/plugin-server/src/config/kafka-topics.ts @@ -38,8 +38,6 @@ export const KAFKA_CLICKHOUSE_SESSION_REPLAY_EVENTS = `${prefix}clickhouse_sessi export const KAFKA_PERFORMANCE_EVENTS = `${prefix}clickhouse_performance_events${suffix}` // write heatmap events to ClickHouse export const KAFKA_CLICKHOUSE_HEATMAP_EVENTS = `${prefix}clickhouse_heatmap_events${suffix}` -// write exception events to ClickHouse -export const KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = `${prefix}exception_symbolification_events${suffix}` // log entries for ingestion into ClickHouse export const KAFKA_LOG_ENTRIES = `${prefix}log_entries${suffix}` @@ -47,3 +45,7 @@ export const KAFKA_LOG_ENTRIES = `${prefix}log_entries${suffix}` // CDP topics export const KAFKA_CDP_FUNCTION_CALLBACKS = `${prefix}cdp_function_callbacks${suffix}` export const KAFKA_CDP_FUNCTION_OVERFLOW = `${prefix}cdp_function_overflow${suffix}` + +// Error tracking topics +export const KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = `${prefix}exception_symbolification_events${suffix}` +export const KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT = `${prefix}clickhouse_error_tracking_issue_fingerprint${suffix}` diff --git a/plugin-server/tests/cdp/examples.ts b/plugin-server/tests/cdp/examples.ts index fafafce472e3d..f92dd9ed4f97a 100644 --- a/plugin-server/tests/cdp/examples.ts +++ b/plugin-server/tests/cdp/examples.ts @@ -708,8 +708,16 @@ export const HOG_MASK_EXAMPLES: Record> person: { masking: { ttl: 30, - hash: '{person.uuid}', - bytecode: ['_h', 32, 'uuid', 32, 'person', 1, 2], + hash: '{person.id}', + bytecode: ['_h', 32, 'id', 32, 'person', 1, 2], + threshold: null, + }, + }, + personAndEvent: { + masking: { + ttl: 30, + hash: '{concat(person.id, event.event)}', + bytecode: ['_H', 1, 32, 'id', 32, 'person', 1, 2, 32, 'event', 32, 'event', 1, 2, 2, 'concat', 2], threshold: null, }, }, diff --git a/plugin-server/tests/cdp/hog-masker.test.ts b/plugin-server/tests/cdp/hog-masker.test.ts index df05043290e63..a3c7a955574db 100644 --- a/plugin-server/tests/cdp/hog-masker.test.ts +++ b/plugin-server/tests/cdp/hog-masker.test.ts @@ -118,6 +118,7 @@ describe('HogMasker', () => { describe('ttl', () => { let hogFunctionPerson: HogFunctionType let hogFunctionAll: HogFunctionType + let hogFunctionPersonAndEvent: HogFunctionType beforeEach(() => { hogFunctionPerson = createHogFunction({ @@ -127,6 +128,13 @@ describe('HogMasker', () => { }, }) + hogFunctionPersonAndEvent = createHogFunction({ + masking: { + ...HOG_MASK_EXAMPLES.personAndEvent.masking!, + ttl: 1, + }, + }) + hogFunctionAll = createHogFunction({ masking: { ...HOG_MASK_EXAMPLES.all.masking!, @@ -145,20 +153,33 @@ describe('HogMasker', () => { }) it('should mask with custom hog hash', async () => { - const globalsPerson1 = createHogExecutionGlobals({ person: { uuid: '1' } as any }) - const globalsPerson2 = createHogExecutionGlobals({ person: { uuid: '2' } as any }) + const globals1 = createHogExecutionGlobals({ + person: { id: '1' } as any, + event: { event: '$pageview' } as any, + }) + const globals2 = createHogExecutionGlobals({ + person: { id: '2' } as any, + event: { event: '$autocapture' } as any, + }) + const globals3 = createHogExecutionGlobals({ + person: { id: '2' } as any, + event: { event: '$pageview' } as any, + }) const invocations = [ - createInvocation(hogFunctionPerson, globalsPerson1), - createInvocation(hogFunctionAll, globalsPerson1), - createInvocation(hogFunctionPerson, globalsPerson2), - createInvocation(hogFunctionAll, globalsPerson2), + createInvocation(hogFunctionPerson, globals1), + createInvocation(hogFunctionAll, globals1), + createInvocation(hogFunctionPersonAndEvent, globals1), + createInvocation(hogFunctionPerson, globals2), + createInvocation(hogFunctionAll, globals2), + createInvocation(hogFunctionPersonAndEvent, globals2), + createInvocation(hogFunctionPersonAndEvent, globals3), ] const res = await masker.filterByMasking(invocations) expect(res.masked.length).toEqual(1) - expect(res.notMasked.length).toEqual(3) + expect(res.notMasked.length).toEqual(6) const res2 = await masker.filterByMasking(invocations) - expect(res2.masked.length).toEqual(4) + expect(res2.masked.length).toEqual(7) expect(res2.notMasked.length).toEqual(0) }) diff --git a/posthog/api/personal_api_key.py b/posthog/api/personal_api_key.py index 23f6d531693a0..355d6cc1c189a 100644 --- a/posthog/api/personal_api_key.py +++ b/posthog/api/personal_api_key.py @@ -5,7 +5,8 @@ from rest_framework.permissions import IsAuthenticated from posthog.models import PersonalAPIKey, User -from posthog.models.personal_api_key import API_SCOPE_ACTIONS, API_SCOPE_OBJECTS, hash_key_value, mask_key_value +from posthog.models.personal_api_key import hash_key_value, mask_key_value +from posthog.models.scopes import API_SCOPE_ACTIONS, API_SCOPE_OBJECTS from posthog.models.team.team import Team from posthog.models.utils import generate_random_token_personal from posthog.permissions import TimeSensitiveActionPermission diff --git a/posthog/api/project.py b/posthog/api/project.py index 0c60c7e649a91..c740dc330801a 100644 --- a/posthog/api/project.py +++ b/posthog/api/project.py @@ -30,7 +30,7 @@ from posthog.models.async_deletion import AsyncDeletion, DeletionType from posthog.models.group_type_mapping import GroupTypeMapping from posthog.models.organization import OrganizationMembership -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.models.product_intent.product_intent import ProductIntent from posthog.models.project import Project from posthog.models.signals import mute_selected_signals @@ -44,7 +44,11 @@ TeamMemberStrictManagementPermission, ) from posthog.user_permissions import UserPermissions, UserPermissionsSerializerMixin -from posthog.utils import get_ip_address, get_week_start_for_country_code +from posthog.utils import ( + get_instance_realm, + get_ip_address, + get_week_start_for_country_code, +) class ProjectSerializer(serializers.ModelSerializer): @@ -195,7 +199,9 @@ def get_live_events_token(self, project: Project) -> Optional[str]: def get_product_intents(self, obj): project = obj team = project.passthrough_team - return ProductIntent.objects.filter(team=team).values("product_type", "created_at", "onboarding_completed_at") + return ProductIntent.objects.filter(team=team).values( + "product_type", "created_at", "onboarding_completed_at", "updated_at" + ) @staticmethod def validate_session_recording_linked_flag(value) -> dict | None: @@ -572,7 +578,7 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): product_intent.updated_at = datetime.now(tz=UTC) product_intent.save() - if created and isinstance(user, User): + if isinstance(user, User): report_user_action( user, "user showed product intent", @@ -582,6 +588,10 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -612,6 +622,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -626,6 +640,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "product_key": product_type, "$current_url": current_url, "$session_id": session_id, + "intent_context": request.data.get("intent_context"), + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) diff --git a/posthog/api/routing.py b/posthog/api/routing.py index 9ff2fede76449..084ddcc94c3ae 100644 --- a/posthog/api/routing.py +++ b/posthog/api/routing.py @@ -18,7 +18,7 @@ SharingAccessTokenAuthentication, ) from posthog.models.organization import Organization -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.models.project import Project from posthog.models.team import Team from posthog.models.user import User diff --git a/posthog/api/survey.py b/posthog/api/survey.py index ea894a7dd30c0..4864612c2b438 100644 --- a/posthog/api/survey.py +++ b/posthog/api/survey.py @@ -597,7 +597,7 @@ def destroy(self, request: Request, *args: Any, **kwargs: Any) -> Response: return super().destroy(request, *args, **kwargs) - @action(methods=["GET"], detail=False) + @action(methods=["GET"], detail=False, required_scopes=["survey:read"]) def responses_count(self, request: request.Request, **kwargs): earliest_survey_start_date = Survey.objects.filter(team_id=self.team_id).aggregate(Min("start_date"))[ "start_date__min" diff --git a/posthog/api/team.py b/posthog/api/team.py index b92f3acaf35ae..88b7f5e28b5ec 100644 --- a/posthog/api/team.py +++ b/posthog/api/team.py @@ -6,17 +6,17 @@ from django.shortcuts import get_object_or_404 from loginas.utils import is_impersonated_session -from posthog.auth import PersonalAPIKeyAuthentication -from posthog.jwt import PosthogJwtAudience, encode_jwt from rest_framework import exceptions, request, response, serializers, viewsets from rest_framework.permissions import BasePermission, IsAuthenticated from posthog.api.routing import TeamAndOrgViewSetMixin from posthog.api.shared import TeamBasicSerializer from posthog.api.utils import action +from posthog.auth import PersonalAPIKeyAuthentication from posthog.constants import AvailableFeature from posthog.event_usage import report_user_action from posthog.geoip import get_geoip_properties +from posthog.jwt import PosthogJwtAudience, encode_jwt from posthog.models import ProductIntent, Team, User from posthog.models.activity_logging.activity_log import ( Detail, @@ -28,7 +28,7 @@ from posthog.models.async_deletion import AsyncDeletion, DeletionType from posthog.models.group_type_mapping import GroupTypeMapping from posthog.models.organization import OrganizationMembership -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.models.project import Project from posthog.models.signals import mute_selected_signals from posthog.models.team.util import delete_batch_exports, delete_bulky_postgres_data @@ -43,7 +43,11 @@ get_organization_from_view, ) from posthog.user_permissions import UserPermissions, UserPermissionsSerializerMixin -from posthog.utils import get_ip_address, get_week_start_for_country_code +from posthog.utils import ( + get_instance_realm, + get_ip_address, + get_week_start_for_country_code, +) class PremiumMultiProjectPermissions(BasePermission): # TODO: Rename to include "Env" in name @@ -211,7 +215,9 @@ def get_live_events_token(self, team: Team) -> Optional[str]: ) def get_product_intents(self, obj): - return ProductIntent.objects.filter(team=obj).values("product_type", "created_at", "onboarding_completed_at") + return ProductIntent.objects.filter(team=obj).values( + "product_type", "created_at", "onboarding_completed_at", "updated_at" + ) @staticmethod def validate_session_recording_linked_flag(value) -> dict | None: @@ -582,7 +588,7 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): product_intent.updated_at = datetime.now(tz=UTC) product_intent.save() - if created and isinstance(user, User): + if isinstance(user, User): report_user_action( user, "user showed product intent", @@ -592,6 +598,10 @@ def add_product_intent(self, request: request.Request, *args, **kwargs): "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -621,6 +631,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "$current_url": current_url, "$session_id": session_id, "intent_context": request.data.get("intent_context"), + "is_first_intent_for_product": created, + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) @@ -635,6 +649,10 @@ def complete_product_onboarding(self, request: request.Request, *args, **kwargs) "product_key": product_type, "$current_url": current_url, "$session_id": session_id, + "intent_context": request.data.get("intent_context"), + "intent_created_at": product_intent.created_at, + "intent_updated_at": product_intent.updated_at, + "realm": get_instance_realm(), }, team=team, ) diff --git a/posthog/api/test/__snapshots__/test_api_docs.ambr b/posthog/api/test/__snapshots__/test_api_docs.ambr index 50950f651c0fe..9b7667ec6484b 100644 --- a/posthog/api/test/__snapshots__/test_api_docs.ambr +++ b/posthog/api/test/__snapshots__/test_api_docs.ambr @@ -1,136 +1,137 @@ # serializer version: 1 # name: TestAPIDocsSchema.test_api_docs_generation_warnings_snapshot list([ - '/home/runner/work/posthog/posthog/posthog/api/plugin_log_entry.py: Warning [PluginLogEntryViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '', + '/home/runner/work/posthog/posthog/ee/api/dashboard_collaborator.py: Warning [DashboardCollaboratorViewSet]: could not derive type of path parameter "project_id" because model "ee.models.dashboard_privilege.DashboardPrivilege" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/explicit_team_member.py: Warning [ExplicitTeamMemberViewSet]: could not derive type of path parameter "project_id" because model "ee.models.explicit_team_membership.ExplicitTeamMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/feature_flag_role_access.py: Warning [FeatureFlagRoleAccessViewSet]: could not derive type of path parameter "project_id" because model "ee.models.feature_flag_role_access.FeatureFlagRoleAccess" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleMembershipViewSet]: could not derive type of path parameter "organization_id" because model "ee.models.rbac.role.RoleMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_associated_flags". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/rbac/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_members". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet > SubscriptionSerializer]: unable to resolve type hint for function "summary". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.subscription.Subscription" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiment_holdouts.py: Warning [ExperimentHoldoutViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.ExperimentHoldout" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiments.py: Warning [EnterpriseExperimentsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.Experiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsTypesViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group_type_mapping.GroupTypeMapping" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group.group.Group" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/insights.py: Warning [EnterpriseInsightsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.insight.Insight" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/clickhouse/views/person.py: Warning [EnterprisePersonViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.person.person.Person" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "session_recording_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet > ActionSerializer]: unable to resolve type hint for function "get_creation_context". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.action.action.Action" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/activity_log.py: Warning [ActivityLogViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.activity_logging.activity_log.ActivityLog" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/annotation.py: Warning [AnnotationsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.annotation.Annotation" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', "/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Error [AppMetricsViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AppMetricsViewSet' should either include a `serializer_class` attribute, or override the `get_serializer_class()` method.)", - '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [AppMetricsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Error [HistoricalExportsAppMetricsViewSet]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.', - '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [AppMetricsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet > BatchExportSerializer]: could not resolve serializer field "HogQLSelectQueryField(required=False)". Defaulting to "string"', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportRunViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExportRun" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/app_metrics.py: Warning [HistoricalExportsAppMetricsViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/cohort.py: Warning [CohortViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.cohort.cohort.Cohort" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/dashboards/dashboard.py: Warning [DashboardsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.dashboard.Dashboard" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/dashboard_collaborator.py: Warning [DashboardCollaboratorViewSet]: could not derive type of path parameter "project_id" because model "ee.models.dashboard_privilege.DashboardPrivilege" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/sharing.py: Warning [SharingConfigurationViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.sharing_configuration.SharingConfiguration" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/event.py: Warning [EventViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_distinct_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_properties". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_event". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_timestamp". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_person". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements_chain". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/dashboards/dashboard_templates.py: Warning [DashboardTemplateViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.dashboard_templates.DashboardTemplate" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/early_access_feature.py: Warning [EarlyAccessFeatureViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.early_access_feature.EarlyAccessFeature" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/event.py: Warning [EventViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/explicit_team_member.py: Warning [ExplicitTeamMemberViewSet]: could not derive type of path parameter "project_id" because model "ee.models.explicit_team_membership.ExplicitTeamMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.exported_asset.ExportedAsset" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet > ExportedAssetSerializer]: unable to resolve type hint for function "has_content". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/event.py: Warning [EventViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + "/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Error [EventDefinitionViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AnonymousUser' object has no attribute 'organization')", + '/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Warning [EventDefinitionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.event_definition.EventDefinition" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet > ExportedAssetSerializer]: unable to resolve type hint for function "filename". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/groups.py: Warning [GroupsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.group.group.Group" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/insights.py: Warning [EnterpriseInsightsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.insight.Insight" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_last_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet > ExportedAssetSerializer]: unable to resolve type hint for function "has_content". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/exports.py: Warning [ExportedAssetViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.exported_asset.ExportedAsset" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/feature_flag.py: Warning [FeatureFlagViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feature_flag.feature_flag.FeatureFlag" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_cache_target_age". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_next_allowed_client_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_result". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hasMore". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_columns". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_timezone". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hasMore". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hogql". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_is_cached". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_last_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_next_allowed_client_refresh". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_query_status". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_hogql". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_result". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_timezone". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/insight.py: Warning [EnterpriseInsightsViewSet > InsightSerializer]: unable to resolve type hint for function "get_types". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/person.py: Warning [EnterprisePersonViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.person.person.Person" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/notebook.py: Warning [NotebookViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.notebook.notebook.Notebook" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_member_count". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_metadata". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/person.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer > MinimalPersonSerializer]: unable to resolve type hint for function "get_distinct_ids". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_config". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_delivery_rate_24h". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_error". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_plugin_info". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet > PluginConfigSerializer]: unable to resolve type hint for function "get_delivery_rate_24h". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsViewSet > PluginSerializer]: unable to resolve type hint for function "get_hog_function_migration_available". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineFrontendAppsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineImportAppsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineTransformationsConfigsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PluginConfigViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.plugin.PluginConfig" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py: Warning [QueryViewSet > ModelMetaclass]: Encountered 2 components with identical names "Person" and different classes and . This will very likely result in an incorrect schema. Try renaming one.', - '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/query.py: Error [QueryViewSet]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.', - '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording.SessionRecording" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/person.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer > MinimalPersonSerializer]: unable to resolve type hint for function "get_distinct_ids". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer]: unable to resolve type hint for function "storage". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/session.py: Warning [SessionViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.subscription.Subscription" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/subscription.py: Warning [SubscriptionViewSet > SubscriptionSerializer]: unable to resolve type hint for function "summary". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_metadata". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/organization.py: Warning [OrganizationViewSet > OrganizationSerializer]: unable to resolve type hint for function "get_member_count". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportOrganizationViewSet]: could not derive type of path parameter "organization_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/plugin.py: Warning [PipelineDestinationsViewSet > PluginSerializer]: unable to resolve type hint for function "get_hog_function_migration_available". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: could not resolve field on model with path "person_on_events_querying_enabled". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: Project has no field named \'person_on_events_querying_enabled\')', + '/home/runner/work/posthog/posthog/posthog/api/plugin_log_entry.py: Warning [PluginLogEntryViewSet]: could not derive type of path parameter "plugin_config_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: could not resolve field on model with path "default_modifiers". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: Project has no field named \'default_modifiers\')', + '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: could not resolve field on model with path "person_on_events_querying_enabled". This is likely a custom field that does some unknown magic. Maybe consider annotating the field/property? Defaulting to "string". (Exception: Project has no field named \'person_on_events_querying_enabled\')', '/home/runner/work/posthog/posthog/posthog/api/project.py: Warning [ProjectViewSet > ProjectBackwardCompatSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "organization_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_members". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/api/role.py: Warning [RoleViewSet > RoleSerializer]: unable to resolve type hint for function "get_associated_flags". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/ee/api/role.py: Warning [RoleMembershipViewSet]: could not derive type of path parameter "organization_id" because model "ee.models.role.RoleMembership" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.action.action.Action" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/action.py: Warning [ActionViewSet > ActionSerializer]: unable to resolve type hint for function "get_creation_context". Consider using a type hint or @extend_schema_field. Defaulting to string.', - '/home/runner/work/posthog/posthog/posthog/api/activity_log.py: Warning [ActivityLogViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.activity_logging.activity_log.ActivityLog" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/annotation.py: Warning [AnnotationsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.annotation.Annotation" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/cohort.py: Warning [CohortViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.cohort.cohort.Cohort" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/dashboards/dashboard_templates.py: Warning [DashboardTemplateViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.dashboard_templates.DashboardTemplate" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/early_access_feature.py: Warning [EarlyAccessFeatureViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.early_access_feature.EarlyAccessFeature" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/team.py: Warning [TeamViewSet > TeamSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', - "/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Error [EventDefinitionViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AnonymousUser' object has no attribute 'organization')", - '/home/runner/work/posthog/posthog/posthog/api/event_definition.py: Warning [EventDefinitionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.event_definition.EventDefinition" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiment_holdouts.py: Warning [ExperimentHoldoutViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.ExperimentHoldout" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/clickhouse/views/experiments.py: Warning [EnterpriseExperimentsViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.experiment.Experiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/feature_flag.py: Warning [FeatureFlagViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feature_flag.feature_flag.FeatureFlag" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/api/feature_flag_role_access.py: Warning [FeatureFlagRoleAccessViewSet]: could not derive type of path parameter "project_id" because model "ee.models.feature_flag_role_access.FeatureFlagRoleAccess" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/notebook.py: Warning [NotebookViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.notebook.notebook.Notebook" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', "/home/runner/work/posthog/posthog/posthog/api/property_definition.py: Error [PropertyDefinitionViewSet]: exception raised while getting serializer. Hint: Is get_serializer_class() returning None or is get_queryset() not working without a request? Ignoring the view for now. (Exception: 'AnonymousUser' object has no attribute 'organization')", '/home/runner/work/posthog/posthog/posthog/api/property_definition.py: Warning [PropertyDefinitionViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.property_definition.PropertyDefinition" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/ee/session_recordings/session_recording_playlist.py: Warning [SessionRecordingPlaylistViewSet]: could not derive type of path parameter "session_recording_id" because model "posthog.session_recordings.models.session_recording_playlist.SessionRecordingPlaylist" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', - '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feedback.survey.Survey" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/proxy_record.py: Warning [ProxyRecordViewset]: could not derive type of path parameter "organization_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/query.py: Error [QueryViewSet]: unable to guess serializer. This is graceful fallback handling for APIViews. Consider using GenericAPIView as view base class, if view is under your control. Either way you may want to add a serializer_class (or method). Ignoring view for now.', + '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/query.py: Warning [QueryViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/session.py: Warning [SessionViewSet]: could not derive type of path parameter "project_id" because it is untyped and obtaining queryset from the viewset failed. Consider adding a type to the path (e.g. ) or annotating the parameter type with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/sharing.py: Warning [SharingConfigurationViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.sharing_configuration.SharingConfiguration" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet > SurveySerializer]: unable to resolve type hint for function "get_conditions". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/api/survey.py: Warning [SurveyViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.feedback.survey.Survey" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/api/team.py: Warning [TeamViewSet > TeamSerializer]: unable to resolve type hint for function "get_product_intents". Consider using a type hint or @extend_schema_field. Defaulting to string.', '/home/runner/work/posthog/posthog/posthog/api/web_experiment.py: Warning [WebExperimentViewSet]: could not derive type of path parameter "project_id" because model "posthog.models.web_experiment.WebExperiment" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportOrganizationViewSet]: could not derive type of path parameter "organization_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportRunViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExportRun" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet > BatchExportSerializer]: could not resolve serializer field "HogQLSelectQueryField(required=False)". Defaulting to "string"', + '/home/runner/work/posthog/posthog/posthog/batch_exports/http.py: Warning [BatchExportViewSet]: could not derive type of path parameter "project_id" because model "posthog.batch_exports.models.BatchExport" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_distinct_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_elements_chain". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_event". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_id". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_person". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_properties". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/models/event/util.py: Warning [EventViewSet > ClickhouseEventSerializer]: unable to resolve type hint for function "get_timestamp". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet > SessionRecordingSerializer]: unable to resolve type hint for function "storage". Consider using a type hint or @extend_schema_field. Defaulting to string.', + '/home/runner/work/posthog/posthog/posthog/session_recordings/session_recording_api.py: Warning [SessionRecordingViewSet]: could not derive type of path parameter "project_id" because model "posthog.session_recordings.models.session_recording.SessionRecording" contained no such field. Consider annotating parameter with @extend_schema. Defaulting to "string".', + '/opt/hostedtoolcache/Python/3.11.9/x64/lib/python3.11/site-packages/pydantic/_internal/_model_construction.py: Warning [QueryViewSet > ModelMetaclass]: Encountered 2 components with identical names "Person" and different classes and . This will very likely result in an incorrect schema. Try renaming one.', + 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: encountered multiple names for the same choice set (HrefMatchingEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "Kind069Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', + 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "kind". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "KindCfaEnum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', 'Warning: enum naming encountered a non-optimally resolvable collision for fields named "type". The same name has been used for multiple choice sets in multiple components. The collision was resolved with "TypeF73Enum". add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: encountered multiple names for the same choice set (EffectivePrivilegeLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: encountered multiple names for the same choice set (MembershipLevelEnum). This may be unwanted even though the generated schema is technically correct. Add an entry to ENUM_NAME_OVERRIDES to fix the naming.', - 'Warning: operationId "environments_app_metrics_historical_exports_retrieve" has collisions [(\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "environments_insights_activity_retrieve" has collisions [(\'/api/environments/{project_id}/insights/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/insights/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "Funnels" has collisions [(\'/api/environments/{project_id}/insights/funnel/\', \'post\'), (\'/api/projects/{project_id}/insights/funnel/\', \'post\')]. resolving with numeral suffixes.', 'Warning: operationId "Trends" has collisions [(\'/api/environments/{project_id}/insights/trend/\', \'post\'), (\'/api/projects/{project_id}/insights/trend/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "environments_persons_activity_retrieve" has collisions [(\'/api/environments/{project_id}/persons/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/persons/activity/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "list" has collisions [(\'/api/organizations/\', \'get\'), (\'/api/organizations/{organization_id}/projects/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "create" has collisions [(\'/api/organizations/\', \'post\'), (\'/api/organizations/{organization_id}/projects/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "retrieve" has collisions [(\'/api/organizations/{id}/\', \'get\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "update" has collisions [(\'/api/organizations/{id}/\', \'put\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'put\')]. resolving with numeral suffixes.', - 'Warning: operationId "partial_update" has collisions [(\'/api/organizations/{id}/\', \'patch\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'patch\')]. resolving with numeral suffixes.', - 'Warning: operationId "destroy" has collisions [(\'/api/organizations/{id}/\', \'delete\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'delete\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_list" has collisions [(\'/api/organizations/{organization_id}/batch_exports/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "app_metrics_historical_exports_retrieve" has collisions [(\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_backfill_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/backfill/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/backfill/\', \'post\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_retrieve" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'put\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'put\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_partial_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'patch\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'patch\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_destroy" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'delete\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'delete\')]. resolving with numeral suffixes.', - 'Warning: operationId "batch_exports_backfill_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/backfill/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/backfill/\', \'post\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_list" has collisions [(\'/api/organizations/{organization_id}/batch_exports/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_logs_retrieve" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/logs/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/{id}/logs/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_partial_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'patch\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'patch\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_pause_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/pause/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/pause/\', \'post\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_retrieve" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'get\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "batch_exports_unpause_create" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/unpause/\', \'post\'), (\'/api/projects/{project_id}/batch_exports/{id}/unpause/\', \'post\')]. resolving with numeral suffixes.', - 'Warning: operationId "app_metrics_historical_exports_retrieve" has collisions [(\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/projects/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "batch_exports_update" has collisions [(\'/api/organizations/{organization_id}/batch_exports/{id}/\', \'put\'), (\'/api/projects/{project_id}/batch_exports/{id}/\', \'put\')]. resolving with numeral suffixes.', 'Warning: operationId "cohorts_activity_retrieve" has collisions [(\'/api/projects/{project_id}/cohorts/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/cohorts/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "create" has collisions [(\'/api/organizations/\', \'post\'), (\'/api/organizations/{organization_id}/projects/\', \'post\')]. resolving with numeral suffixes.', + 'Warning: operationId "destroy" has collisions [(\'/api/organizations/{id}/\', \'delete\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'delete\')]. resolving with numeral suffixes.', + 'Warning: operationId "environments_app_metrics_historical_exports_retrieve" has collisions [(\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/\', \'get\'), (\'/api/environments/{project_id}/app_metrics/{plugin_config_id}/historical_exports/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "environments_insights_activity_retrieve" has collisions [(\'/api/environments/{project_id}/insights/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/insights/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "environments_persons_activity_retrieve" has collisions [(\'/api/environments/{project_id}/persons/{id}/activity/\', \'get\'), (\'/api/environments/{project_id}/persons/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "event_definitions_retrieve" has collisions [(\'/api/projects/{project_id}/event_definitions/\', \'get\'), (\'/api/projects/{project_id}/event_definitions/{id}/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "feature_flags_activity_retrieve" has collisions [(\'/api/projects/{project_id}/feature_flags/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/feature_flags/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "insights_activity_retrieve" has collisions [(\'/api/projects/{project_id}/insights/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/insights/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "list" has collisions [(\'/api/organizations/\', \'get\'), (\'/api/organizations/{organization_id}/projects/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "notebooks_activity_retrieve" has collisions [(\'/api/projects/{project_id}/notebooks/{short_id}/activity/\', \'get\'), (\'/api/projects/{project_id}/notebooks/activity/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "partial_update" has collisions [(\'/api/organizations/{id}/\', \'patch\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'patch\')]. resolving with numeral suffixes.', 'Warning: operationId "persons_activity_retrieve" has collisions [(\'/api/projects/{project_id}/persons/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/persons/activity/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "property_definitions_retrieve" has collisions [(\'/api/projects/{project_id}/property_definitions/\', \'get\'), (\'/api/projects/{project_id}/property_definitions/{id}/\', \'get\')]. resolving with numeral suffixes.', + 'Warning: operationId "retrieve" has collisions [(\'/api/organizations/{id}/\', \'get\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'get\')]. resolving with numeral suffixes.', 'Warning: operationId "surveys_activity_retrieve" has collisions [(\'/api/projects/{project_id}/surveys/{id}/activity/\', \'get\'), (\'/api/projects/{project_id}/surveys/activity/\', \'get\')]. resolving with numeral suffixes.', - '', + 'Warning: operationId "update" has collisions [(\'/api/organizations/{id}/\', \'put\'), (\'/api/organizations/{organization_id}/projects/{id}/\', \'put\')]. resolving with numeral suffixes.', ]) # --- diff --git a/posthog/api/test/__snapshots__/test_decide.ambr b/posthog/api/test/__snapshots__/test_decide.ambr index 93ec860efb05b..18fc2e400e3fd 100644 --- a/posthog/api/test/__snapshots__/test_decide.ambr +++ b/posthog/api/test/__snapshots__/test_decide.ambr @@ -523,7 +523,8 @@ ''' SELECT "posthog_productintent"."product_type", "posthog_productintent"."created_at", - "posthog_productintent"."onboarding_completed_at" + "posthog_productintent"."onboarding_completed_at", + "posthog_productintent"."updated_at" FROM "posthog_productintent" WHERE "posthog_productintent"."team_id" = 2 ''' diff --git a/posthog/api/test/test_api_docs.py b/posthog/api/test/test_api_docs.py index f7f7ab1d418b0..d5e1fc9b3bbf6 100644 --- a/posthog/api/test/test_api_docs.py +++ b/posthog/api/test/test_api_docs.py @@ -30,4 +30,4 @@ def test_api_docs_generation_warnings_snapshot(self) -> None: # we log lots of warnings when generating the schema warnings = self._capsys.readouterr().err.split("\n") - assert warnings == self._snapshot + assert sorted(warnings) == self._snapshot diff --git a/posthog/api/test/test_organization_feature_flag.py b/posthog/api/test/test_organization_feature_flag.py index 83550c689d5ae..65c43575f9b7e 100644 --- a/posthog/api/test/test_organization_feature_flag.py +++ b/posthog/api/test/test_organization_feature_flag.py @@ -3,7 +3,7 @@ from rest_framework import status -from ee.models.organization_resource_access import OrganizationResourceAccess +from ee.models.rbac.organization_resource_access import OrganizationResourceAccess from posthog.api.dashboards.dashboard import Dashboard from posthog.constants import AvailableFeature from posthog.models import FeatureFlag diff --git a/posthog/api/test/test_plugin.py b/posthog/api/test/test_plugin.py index f92350045a38c..10967d63bb873 100644 --- a/posthog/api/test/test_plugin.py +++ b/posthog/api/test/test_plugin.py @@ -371,35 +371,36 @@ def test_update_plugin_auth(self, mock_sync_from_plugin_archive, mock_get, mock_ self.assertEqual(response.status_code, 403) self.assertEqual(mock_sync_from_plugin_archive.call_count, 2) # Not extracted on auth failure - @freeze_time("2021-08-25T22:09:14.252Z") def test_delete_plugin_auth(self, mock_get, mock_reload): - repo_url = "https://github.com/PostHog/helloworldplugin" - response = self.client.post("/api/organizations/@current/plugins/", {"url": repo_url}) - self.assertEqual(response.status_code, 201) + with freeze_time("2021-08-25T22:09:14.252Z"): + repo_url = "https://github.com/PostHog/helloworldplugin" + response = self.client.post("/api/organizations/@current/plugins/", {"url": repo_url}) + self.assertEqual(response.status_code, 201) - plugin_id = response.json()["id"] + with freeze_time("2021-08-25T22:09:14.253Z"): + plugin_id = response.json()["id"] - api_url = "/api/organizations/@current/plugins/{}".format(response.json()["id"]) + api_url = "/api/organizations/@current/plugins/{}".format(response.json()["id"]) - for level in ( - Organization.PluginsAccessLevel.NONE, - Organization.PluginsAccessLevel.CONFIG, - ): - self.organization.plugins_access_level = level + for level in ( + Organization.PluginsAccessLevel.NONE, + Organization.PluginsAccessLevel.CONFIG, + ): + self.organization.plugins_access_level = level + self.organization.save() + response = self.client.delete(api_url) + self.assertEqual(response.status_code, 403) + + self.organization.plugins_access_level = Organization.PluginsAccessLevel.INSTALL self.organization.save() response = self.client.delete(api_url) - self.assertEqual(response.status_code, 403) - - self.organization.plugins_access_level = Organization.PluginsAccessLevel.INSTALL - self.organization.save() - response = self.client.delete(api_url) self.assertEqual(response.status_code, 204) self.assert_plugin_activity( [ { "user": {"first_name": "", "email": "user1@posthog.com"}, - "activity": "installed", - "created_at": "2021-08-25T22:09:14.252000Z", + "activity": "uninstalled", + "created_at": "2021-08-25T22:09:14.253000Z", "scope": "Plugin", "item_id": str(plugin_id), "detail": { @@ -412,7 +413,7 @@ def test_delete_plugin_auth(self, mock_get, mock_reload): }, { "user": {"first_name": "", "email": "user1@posthog.com"}, - "activity": "uninstalled", + "activity": "installed", "created_at": "2021-08-25T22:09:14.252000Z", "scope": "Plugin", "item_id": str(plugin_id), diff --git a/posthog/api/test/test_survey.py b/posthog/api/test/test_survey.py index c6de95a44702e..c79ab601b3369 100644 --- a/posthog/api/test/test_survey.py +++ b/posthog/api/test/test_survey.py @@ -11,6 +11,7 @@ from rest_framework import status from posthog.api.survey import nh3_clean_with_allow_list +from posthog.api.test.test_personal_api_keys import PersonalAPIKeysBaseTest from posthog.constants import AvailableFeature from posthog.models import Action, FeatureFlag, Team from posthog.models.cohort.cohort import Cohort @@ -2783,6 +2784,41 @@ def test_list_surveys_excludes_description(self): assert surveys[1]["name"] == "Survey 2" +class TestSurveyAPITokens(PersonalAPIKeysBaseTest, APIBaseTest): + def setUp(self): + super().setUp() + self.key.scopes = ["survey:read"] + self.key.save() + + @freeze_time("2024-05-01 14:40:09") + def test_responses_count_works_with_survey_read(self): + survey_counts = { + "d63bb580-01af-4819-aae5-edcf7ef2044f": 3, + "fe7c4b62-8fc9-401e-b483-e4ff98fd13d5": 6, + "daed7689-d498-49fe-936f-e85554351b6c": 100, + } + + earliest_survey = Survey.objects.create(team_id=self.team.id) + earliest_survey.start_date = datetime.now() - timedelta(days=101) + earliest_survey.save() + + for survey_id, count in survey_counts.items(): + for _ in range(count): + _create_event( + event="survey sent", + team=self.team, + distinct_id=self.user.id, + properties={"$survey_id": survey_id}, + timestamp=datetime.now() - timedelta(days=count), + ) + + response = self._do_request(f"/api/projects/{self.team.id}/surveys/responses_count") + self.assertEqual(response.status_code, status.HTTP_200_OK) + + data = response.json() + self.assertEqual(data, survey_counts) + + class TestResponsesCount(ClickhouseTestMixin, APIBaseTest): @snapshot_clickhouse_queries @freeze_time("2024-05-01 14:40:09") diff --git a/posthog/api/test/test_team.py b/posthog/api/test/test_team.py index ba697d073699f..3a881facfea44 100644 --- a/posthog/api/test/test_team.py +++ b/posthog/api/test/test_team.py @@ -26,6 +26,7 @@ from posthog.temporal.common.client import sync_connect from posthog.temporal.common.schedule import describe_schedule from posthog.test.base import APIBaseTest +from posthog.utils import get_instance_realm def team_api_test_factory(): @@ -1042,6 +1043,10 @@ def test_can_add_product_intent( "$session_id": "test_session_id", "intent_context": "onboarding product selected", "$set_once": {"first_onboarding_product_selected": "product_analytics"}, + "is_first_intent_for_product": True, + "intent_created_at": datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + "intent_updated_at": datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + "realm": get_instance_realm(), }, team=self.team, ) @@ -1073,6 +1078,10 @@ def test_can_complete_product_onboarding( "product_key": "product_analytics", "$current_url": "https://posthogtest.com/my-url", "$session_id": "test_session_id", + "intent_context": None, + "intent_created_at": datetime(2024, 1, 1, 0, 0, 0, tzinfo=UTC), + "intent_updated_at": datetime(2024, 1, 5, 0, 0, 0, tzinfo=UTC), + "realm": get_instance_realm(), }, team=self.team, ) diff --git a/posthog/batch_exports/http.py b/posthog/batch_exports/http.py index 5d2589065345a..72bc94adf03bd 100644 --- a/posthog/batch_exports/http.py +++ b/posthog/batch_exports/http.py @@ -183,7 +183,7 @@ def to_representation(self, instance: BatchExportDestination) -> dict: class HogQLSelectQueryField(serializers.Field): - def to_internal_value(self, data: str) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_internal_value(self, data: str) -> ast.SelectQuery | ast.SelectSetQuery: """Parse a HogQL SelectQuery from a string query.""" try: parsed_query = parse_select(data) @@ -329,7 +329,7 @@ def serialize_hogql_query_to_batch_export_schema(self, hogql_query: ast.SelectQu return batch_export_schema - def validate_hogql_query(self, hogql_query: ast.SelectQuery | ast.SelectUnionQuery) -> ast.SelectQuery: + def validate_hogql_query(self, hogql_query: ast.SelectQuery | ast.SelectSetQuery) -> ast.SelectQuery: """Validate a HogQLQuery being used for batch exports. This method essentially checks that a query is supported by batch exports: @@ -338,7 +338,7 @@ def validate_hogql_query(self, hogql_query: ast.SelectQuery | ast.SelectUnionQue 3. Query must SELECT FROM events, and only from events. """ - if isinstance(hogql_query, ast.SelectUnionQuery): + if isinstance(hogql_query, ast.SelectSetQuery): raise serializers.ValidationError("UNIONs are not supported") parsed = cast(ast.SelectQuery, hogql_query) diff --git a/posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py b/posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py new file mode 100644 index 0000000000000..1d24e713ee6c3 --- /dev/null +++ b/posthog/clickhouse/migrations/0083_add_error_tracking_issue_fingerprint_overrides_table_and_consumer.py @@ -0,0 +1,12 @@ +from posthog.clickhouse.client.migration_tools import run_sql_with_exceptions +from posthog.models.error_tracking.sql import ( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL, +) + +operations = [ + run_sql_with_exceptions(ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL()), + run_sql_with_exceptions(KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL()), + run_sql_with_exceptions(ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL), +] diff --git a/posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py b/posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py new file mode 100644 index 0000000000000..d0da2eb158b6d --- /dev/null +++ b/posthog/clickhouse/migrations/0083_recreate_sessions_v1_after_limiting_teams.py @@ -0,0 +1,8 @@ +from posthog.clickhouse.client.migration_tools import run_sql_with_exceptions +from posthog.models.sessions.sql import DROP_SESSION_MATERIALIZED_VIEW_SQL, SESSIONS_TABLE_MV_SQL + +operations = [ + # drop the mv, and recreate it with the new part of the WHERE clause + run_sql_with_exceptions(DROP_SESSION_MATERIALIZED_VIEW_SQL()), + run_sql_with_exceptions(SESSIONS_TABLE_MV_SQL()), +] diff --git a/posthog/clickhouse/schema.py b/posthog/clickhouse/schema.py index e3f5044b7a419..1df1fa52792af 100644 --- a/posthog/clickhouse/schema.py +++ b/posthog/clickhouse/schema.py @@ -84,6 +84,11 @@ PERSON_DISTINCT_ID_OVERRIDES_MV_SQL, KAFKA_PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, ) +from posthog.models.error_tracking.sql import ( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL, + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, +) from posthog.models.person_overrides.sql import ( PERSON_OVERRIDES_CREATE_TABLE_SQL, PERSON_OVERRIDES_CREATE_DICTIONARY_SQL, @@ -130,6 +135,7 @@ PERSONS_DISTINCT_ID_TABLE_SQL, PERSON_DISTINCT_ID2_TABLE_SQL, PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, PLUGIN_LOG_ENTRIES_TABLE_SQL, SESSION_RECORDING_EVENTS_TABLE_SQL, INGESTION_WARNINGS_DATA_TABLE_SQL, @@ -170,6 +176,7 @@ KAFKA_PERSONS_DISTINCT_ID_TABLE_SQL, KAFKA_PERSON_DISTINCT_ID2_TABLE_SQL, KAFKA_PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, KAFKA_PLUGIN_LOG_ENTRIES_TABLE_SQL, KAFKA_SESSION_RECORDING_EVENTS_TABLE_SQL, KAFKA_INGESTION_WARNINGS_TABLE_SQL, @@ -189,6 +196,7 @@ PERSONS_DISTINCT_ID_TABLE_MV_SQL, PERSON_DISTINCT_ID2_MV_SQL, PERSON_DISTINCT_ID_OVERRIDES_MV_SQL, + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL, PLUGIN_LOG_ENTRIES_TABLE_MV_SQL, SESSION_RECORDING_EVENTS_TABLE_MV_SQL, INGESTION_WARNINGS_MV_TABLE_SQL, diff --git a/posthog/clickhouse/test/__snapshots__/test_schema.ambr b/posthog/clickhouse/test/__snapshots__/test_schema.ambr index ac13d60ef2d66..1fc54f30fdc78 100644 --- a/posthog/clickhouse/test/__snapshots__/test_schema.ambr +++ b/posthog/clickhouse/test/__snapshots__/test_schema.ambr @@ -74,6 +74,21 @@ ''' # --- +# name: test_create_kafka_table_with_different_kafka_host[kafka_error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS kafka_error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + ) ENGINE = Kafka('test.kafka.broker:9092', 'clickhouse_error_tracking_issue_fingerprint_test', 'clickhouse-error-tracking-issue-fingerprint-overrides', 'JSONEachRow') + + ''' +# --- # name: test_create_kafka_table_with_different_kafka_host[kafka_events_dead_letter_queue] ''' @@ -558,6 +573,50 @@ Order By (team_id, cohort_id, person_id, version) + ''' +# --- +# name: test_create_table_query[error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + + , _timestamp DateTime + , _offset UInt64 + , _partition UInt64 + + , INDEX kafka_timestamp_minmax_error_tracking_issue_fingerprint_overrides _timestamp TYPE minmax GRANULARITY 3 + + ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/77f1df52-4b43-11e9-910f-b8ca3a9b9f3e_noshard/posthog.error_tracking_issue_fingerprint_overrides', '{replica}-{shard}', version) + + ORDER BY (team_id, fingerprint) + SETTINGS index_granularity = 512 + + ''' +# --- +# name: test_create_table_query[error_tracking_issue_fingerprint_overrides_mv] + ''' + + CREATE MATERIALIZED VIEW IF NOT EXISTS error_tracking_issue_fingerprint_overrides_mv ON CLUSTER 'posthog' + TO posthog_test.error_tracking_issue_fingerprint_overrides + AS SELECT + team_id, + fingerprint, + issue_id, + is_deleted, + version, + _timestamp, + _offset, + _partition + FROM posthog_test.kafka_error_tracking_issue_fingerprint_overrides + WHERE version > 0 -- only store updated rows, not newly inserted ones + ''' # --- # name: test_create_table_query[events] @@ -877,6 +936,21 @@ ''' # --- +# name: test_create_table_query[kafka_error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS kafka_error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + ) ENGINE = Kafka('kafka:9092', 'clickhouse_error_tracking_issue_fingerprint_test', 'clickhouse-error-tracking-issue-fingerprint-overrides', 'JSONEachRow') + + ''' +# --- # name: test_create_table_query[kafka_events_dead_letter_queue] ''' @@ -2086,7 +2160,7 @@ sumIf(1, event='$autocapture') as autocapture_count FROM posthog_test.sharded_events - WHERE `$session_id` IS NOT NULL AND `$session_id` != '' + WHERE `$session_id` IS NOT NULL AND `$session_id` != '' AND team_id IN (1, 2, 13610, 19279, 21173, 29929, 32050, 9910, 11775, 21129, 31490) GROUP BY `$session_id`, team_id @@ -2910,6 +2984,31 @@ Order By (team_id, cohort_id, person_id, version) + ''' +# --- +# name: test_create_table_query_replicated_and_storage[error_tracking_issue_fingerprint_overrides] + ''' + + CREATE TABLE IF NOT EXISTS error_tracking_issue_fingerprint_overrides ON CLUSTER 'posthog' + ( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + + + , _timestamp DateTime + , _offset UInt64 + , _partition UInt64 + + , INDEX kafka_timestamp_minmax_error_tracking_issue_fingerprint_overrides _timestamp TYPE minmax GRANULARITY 3 + + ) ENGINE = ReplicatedReplacingMergeTree('/clickhouse/tables/77f1df52-4b43-11e9-910f-b8ca3a9b9f3e_noshard/posthog.error_tracking_issue_fingerprint_overrides', '{replica}-{shard}', version) + + ORDER BY (team_id, fingerprint) + SETTINGS index_granularity = 512 + ''' # --- # name: test_create_table_query_replicated_and_storage[events_dead_letter_queue] diff --git a/posthog/clickhouse/test/test_sessions_model.py b/posthog/clickhouse/test/test_sessions_model.py index 0e3631e0ab3cd..0042456a03d95 100644 --- a/posthog/clickhouse/test/test_sessions_model.py +++ b/posthog/clickhouse/test/test_sessions_model.py @@ -1,8 +1,10 @@ from posthog.clickhouse.client import sync_execute, query_with_columns +from posthog.models import Team from posthog.test.base import ( _create_event, ClickhouseTestMixin, BaseTest, + ClickhouseDestroyTablesMixin, ) distinct_id_counter = 0 @@ -21,7 +23,12 @@ def create_session_id(): return f"s{session_id_counter}" -class TestSessionsModel(ClickhouseTestMixin, BaseTest): +# only certain team ids can insert events into this legacy sessions table, see sessions/sql.py for more info +TEAM_ID = 2 +TEAM = Team(id=TEAM_ID) + + +class TestSessionsModel(ClickhouseDestroyTablesMixin, ClickhouseTestMixin, BaseTest): def select_by_session_id(self, session_id): return query_with_columns( """ @@ -34,7 +41,7 @@ def select_by_session_id(self, session_id): """, { "session_id": session_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) @@ -42,7 +49,7 @@ def test_it_creates_session_when_creating_event(self): distinct_id = create_distinct_id() session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/", "$session_id": session_id}, @@ -60,7 +67,7 @@ def test_it_creates_session_when_creating_event(self): """, { "distinct_id": distinct_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) @@ -72,14 +79,14 @@ def test_handles_different_distinct_id_across_same_session(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id1, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id2, properties={"$session_id": session_id}, @@ -96,28 +103,28 @@ def test_handles_entry_and_exit_urls(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/entry", "$session_id": session_id}, timestamp="2024-03-08:01", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/middle", "$session_id": session_id}, timestamp="2024-03-08:02", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/middle", "$session_id": session_id}, timestamp="2024-03-08:03", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$current_url": "/exit", "$session_id": session_id}, @@ -136,14 +143,14 @@ def test_handles_initial_utm_properties(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id, "utm_source": "source"}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id, "utm_source": "other_source"}, @@ -159,35 +166,35 @@ def test_counts_pageviews_autocaptures_and_events(self): session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$autocapture", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$autocapture", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="other event", distinct_id=distinct_id, properties={"$session_id": session_id}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageleave", distinct_id=distinct_id, properties={"$session_id": session_id}, @@ -209,14 +216,14 @@ def test_separates_sessions_across_same_user(self): session_id3 = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id1}, timestamp="2024-03-08", ) _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id2}, @@ -235,7 +242,7 @@ def test_select_from_sessions(self): distinct_id = create_distinct_id() session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id}, @@ -260,7 +267,7 @@ def test_select_from_sessions(self): """, { "session_id": session_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) self.assertEqual(len(responses), 1) @@ -270,7 +277,7 @@ def test_select_from_sessions_mv(self): distinct_id = create_distinct_id() session_id = create_session_id() _create_event( - team=self.team, + team=TEAM, event="$pageview", distinct_id=distinct_id, properties={"$session_id": session_id}, @@ -295,7 +302,7 @@ def test_select_from_sessions_mv(self): """, { "session_id": session_id, - "team_id": self.team.id, + "team_id": TEAM_ID, }, ) self.assertEqual(len(responses), 1) diff --git a/posthog/conftest.py b/posthog/conftest.py index eb7c5500adb19..938ae3028bfeb 100644 --- a/posthog/conftest.py +++ b/posthog/conftest.py @@ -68,6 +68,7 @@ def reset_clickhouse_tables(): TRUNCATE_PERSON_STATIC_COHORT_TABLE_SQL, TRUNCATE_PERSON_TABLE_SQL, ) + from posthog.models.error_tracking.sql import TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL from posthog.models.sessions.sql import TRUNCATE_SESSIONS_TABLE_SQL from posthog.session_recordings.sql.session_recording_event_sql import ( TRUNCATE_SESSION_RECORDING_EVENTS_TABLE_SQL, @@ -81,6 +82,7 @@ def reset_clickhouse_tables(): TRUNCATE_PERSON_DISTINCT_ID2_TABLE_SQL, TRUNCATE_PERSON_DISTINCT_ID_OVERRIDES_TABLE_SQL, TRUNCATE_PERSON_STATIC_COHORT_TABLE_SQL, + TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL, TRUNCATE_SESSION_RECORDING_EVENTS_TABLE_SQL(), TRUNCATE_PLUGIN_LOG_ENTRIES_TABLE_SQL, TRUNCATE_COHORTPEOPLE_TABLE_SQL, diff --git a/posthog/hogql/ast.py b/posthog/hogql/ast.py index c5aef314244ed..11c7f001c50b9 100644 --- a/posthog/hogql/ast.py +++ b/posthog/hogql/ast.py @@ -1,5 +1,6 @@ from enum import StrEnum -from typing import Any, Literal, Optional, Union +from typing import Any, Literal, Optional, Union, get_args +from collections.abc import Sequence from dataclasses import dataclass, field from posthog.hogql.base import Type, Expr, CTE, ConstantType, UnknownType, AST @@ -173,7 +174,7 @@ def get_child(self, name: str, context: HogQLContext) -> Type: TableOrSelectType = Union[ - BaseTableType, "SelectUnionQueryType", "SelectQueryType", "SelectQueryAliasType", "SelectViewType" + BaseTableType, "SelectSetQueryType", "SelectQueryType", "SelectQueryAliasType", "SelectViewType" ] @@ -243,9 +244,9 @@ class SelectQueryType(Type): tables: dict[str, TableOrSelectType] = field(default_factory=dict) ctes: dict[str, CTE] = field(default_factory=dict) # all from and join subqueries without aliases - anonymous_tables: list[Union["SelectQueryType", "SelectUnionQueryType"]] = field(default_factory=list) + anonymous_tables: list[Union["SelectQueryType", "SelectSetQueryType"]] = field(default_factory=list) # the parent select query, if this is a lambda - parent: Optional[Union["SelectQueryType", "SelectUnionQueryType"]] = None + parent: Optional[Union["SelectQueryType", "SelectSetQueryType"]] = None def get_alias_for_table_type(self, table_type: TableOrSelectType) -> Optional[str]: for key, value in self.tables.items(): @@ -276,8 +277,8 @@ def resolve_constant_type(self, context: HogQLContext) -> "ConstantType": @dataclass(kw_only=True) -class SelectUnionQueryType(Type): - types: list[SelectQueryType] +class SelectSetQueryType(Type): + types: list[Union[SelectQueryType, "SelectSetQueryType"]] def get_alias_for_table_type(self, table_type: TableOrSelectType) -> Optional[str]: return self.types[0].get_alias_for_table_type(table_type) @@ -296,7 +297,7 @@ def resolve_column_constant_type(self, name: str, context: HogQLContext) -> "Con class SelectViewType(Type): view_name: str alias: str - select_query_type: SelectQueryType | SelectUnionQueryType + select_query_type: SelectQueryType | SelectSetQueryType def get_child(self, name: str, context: HogQLContext) -> Type: if name == "*": @@ -343,7 +344,7 @@ def resolve_column_constant_type(self, name: str, context: HogQLContext) -> "Con @dataclass(kw_only=True) class SelectQueryAliasType(Type): alias: str - select_query_type: SelectQueryType | SelectUnionQueryType + select_query_type: SelectQueryType | SelectSetQueryType def get_child(self, name: str, context: HogQLContext) -> Type: if name == "*": @@ -763,7 +764,7 @@ class JoinExpr(Expr): type: Optional[TableOrSelectType] = None join_type: Optional[str] = None - table: Optional[Union["SelectQuery", "SelectUnionQuery", Field]] = None + table: Optional[Union["SelectQuery", "SelectSetQuery", Field]] = None table_args: Optional[list[Expr]] = None alias: Optional[str] = None table_final: Optional[bool] = None @@ -820,10 +821,35 @@ class SelectQuery(Expr): view_name: Optional[str] = None +SetOperator = Literal["UNION ALL", "INTERSECT", "EXCEPT"] + + +@dataclass(kw_only=True) +class SelectSetNode: + select_query: Union[SelectQuery, "SelectSetQuery"] + set_operator: SetOperator + + def __post_init__(self): + if self.set_operator not in get_args(SetOperator): + raise ValueError("Invalid Set Operator") + + @dataclass(kw_only=True) -class SelectUnionQuery(Expr): - type: Optional[SelectUnionQueryType] = None - select_queries: list[SelectQuery] +class SelectSetQuery(Expr): + type: Optional[SelectSetQueryType] = None + initial_select_query: Union[SelectQuery, "SelectSetQuery"] + subsequent_select_queries: list[SelectSetNode] + + @classmethod + def create_from_queries( + cls, queries: Sequence[Union[SelectQuery, "SelectSetQuery"]], set_operator: SetOperator + ) -> "SelectSetQuery": + return SelectSetQuery( + initial_select_query=queries[0], + subsequent_select_queries=[ + SelectSetNode(select_query=query, set_operator=set_operator) for query in queries[1:] + ], + ) @dataclass(kw_only=True) diff --git a/posthog/hogql/autocomplete.py b/posthog/hogql/autocomplete.py index 433cdce356382..09b5af34be0b9 100644 --- a/posthog/hogql/autocomplete.py +++ b/posthog/hogql/autocomplete.py @@ -28,6 +28,7 @@ from posthog.hogql.timings import HogQLTimings from posthog.hogql.visitor import TraversingVisitor, clone_expr from posthog.hogql_queries.query_runner import get_query_runner +from posthog.hogql.resolver_utils import extract_select_queries from posthog.models.insight_variable import InsightVariable from posthog.models.property_definition import PropertyDefinition from posthog.models.team.team import Team @@ -475,8 +476,8 @@ def get_hogql_autocomplete( if isinstance(select_ast, ast.SelectQuery): ctes = select_ast.ctes - elif isinstance(select_ast, ast.SelectUnionQuery): - ctes = select_ast.select_queries[0].ctes + elif isinstance(select_ast, ast.SelectSetQuery): + ctes = next(extract_select_queries(select_ast)).ctes nearest_select = find_node.nearest_select_query or select_ast table_has_alias = ( diff --git a/posthog/hogql/database/schema/test/test_sessions_v1.py b/posthog/hogql/database/schema/test/test_sessions_v1.py index eefd04197deab..77f41fd2f6bbc 100644 --- a/posthog/hogql/database/schema/test/test_sessions_v1.py +++ b/posthog/hogql/database/schema/test/test_sessions_v1.py @@ -8,6 +8,7 @@ ) from posthog.hogql.parser import parse_select from posthog.hogql.query import execute_hogql_query +from posthog.models import Team from posthog.models.property_definition import PropertyType from posthog.models.utils import uuid7 from posthog.schema import HogQLQueryModifiers, BounceRatePageViewMode, SessionTableVersion @@ -15,16 +16,20 @@ APIBaseTest, ClickhouseTestMixin, _create_event, - _create_person, + ClickhouseDestroyTablesMixin, ) +# only certain team ids can insert events into this legacy sessions table, see sessions/sql.py for more info +TEAM_ID = 2 +TEAM = Team(id=TEAM_ID, pk=TEAM_ID) -class TestSessionsV1(ClickhouseTestMixin, APIBaseTest): + +class TestSessionsV1(ClickhouseDestroyTablesMixin, ClickhouseTestMixin, APIBaseTest): def __execute(self, query): modifiers = HogQLQueryModifiers(sessionTableVersion=SessionTableVersion.V1) return execute_hogql_query( query=query, - team=self.team, + team=TEAM, modifiers=modifiers, ) @@ -33,7 +38,7 @@ def test_select_star(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$current_url": "https://example.com", "$session_id": session_id}, ) @@ -56,7 +61,7 @@ def test_select_event_sessions_star(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$current_url": "https://example.com", "$session_id": session_id}, ) @@ -93,7 +98,7 @@ def test_channel_type(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"gad_source": "1", "$session_id": session_id}, ) @@ -116,7 +121,7 @@ def test_event_dot_session_dot_channel_type(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"gad_source": "1", "$session_id": session_id}, ) @@ -139,7 +144,7 @@ def test_events_session_dot_channel_type(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"gad_source": "1", "$session_id": session_id}, ) @@ -157,57 +162,26 @@ def test_events_session_dot_channel_type(self): "Paid Search", ) - def test_persons_and_sessions_on_events(self): - p1 = _create_person(distinct_ids=["d1"], team=self.team) - p2 = _create_person(distinct_ids=["d2"], team=self.team) - - s1 = "session_test_persons_and_sessions_on_events_1" - s2 = "session_test_persons_and_sessions_on_events_2" - - _create_event( - event="$pageview", - team=self.team, - distinct_id="d1", - properties={"$session_id": s1, "utm_source": "source1"}, - ) - _create_event( - event="$pageview", - team=self.team, - distinct_id="d2", - properties={"$session_id": s2, "utm_source": "source2"}, - ) - - response = self.__execute( - parse_select( - "select events.person_id, session.$entry_utm_source from events where $session_id = {session_id} or $session_id = {session_id2} order by 2 asc", - placeholders={"session_id": ast.Constant(value=s1), "session_id2": ast.Constant(value=s2)}, - ), - ) - - [row1, row2] = response.results or [] - self.assertEqual(row1, (p1.uuid, "source1")) - self.assertEqual(row2, (p2.uuid, "source2")) - @parameterized.expand([(BounceRatePageViewMode.UNIQ_URLS,), (BounceRatePageViewMode.COUNT_PAGEVIEWS,)]) def test_bounce_rate(self, bounceRatePageViewMode): # person with 2 different sessions _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$session_id": "s1a", "$current_url": "https://example.com/1"}, timestamp="2023-12-02", ) _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$session_id": "s1a", "$current_url": "https://example.com/2"}, timestamp="2023-12-03", ) _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={"$session_id": "s1b", "$current_url": "https://example.com/3"}, timestamp="2023-12-12", @@ -215,7 +189,7 @@ def test_bounce_rate(self, bounceRatePageViewMode): # session with 1 pageview _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d2", properties={"$session_id": "s2", "$current_url": "https://example.com/4"}, timestamp="2023-12-11", @@ -223,14 +197,14 @@ def test_bounce_rate(self, bounceRatePageViewMode): # session with 1 pageview and 1 autocapture _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d3", properties={"$session_id": "s3", "$current_url": "https://example.com/5"}, timestamp="2023-12-11", ) _create_event( event="$autocapture", - team=self.team, + team=TEAM, distinct_id="d3", properties={"$session_id": "s3", "$current_url": "https://example.com/5"}, timestamp="2023-12-11", @@ -238,14 +212,14 @@ def test_bounce_rate(self, bounceRatePageViewMode): # short session with a pageleave _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d4", properties={"$session_id": "s4", "$current_url": "https://example.com/6"}, timestamp="2023-12-11T12:00:00", ) _create_event( event="$pageleave", - team=self.team, + team=TEAM, distinct_id="d4", properties={"$session_id": "s4", "$current_url": "https://example.com/6"}, timestamp="2023-12-11T12:00:01", @@ -253,14 +227,14 @@ def test_bounce_rate(self, bounceRatePageViewMode): # long session with a pageleave _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d5", properties={"$session_id": "s5", "$current_url": "https://example.com/7"}, timestamp="2023-12-11T12:00:00", ) _create_event( event="$pageleave", - team=self.team, + team=TEAM, distinct_id="d5", properties={"$session_id": "s5", "$current_url": "https://example.com/7"}, timestamp="2023-12-11T12:00:11", @@ -269,7 +243,7 @@ def test_bounce_rate(self, bounceRatePageViewMode): parse_select( "select $is_bounce, session_id from sessions ORDER BY session_id", ), - self.team, + TEAM, modifiers=HogQLQueryModifiers( bounceRatePageViewMode=bounceRatePageViewMode, sessionTableVersion=SessionTableVersion.V1 ), @@ -291,7 +265,7 @@ def test_can_use_v1_and_v2_fields(self): _create_event( event="$pageview", - team=self.team, + team=TEAM, distinct_id="d1", properties={ "$current_url": "https://example.com/pathname", @@ -372,4 +346,4 @@ def test_entry_utm(self): def test_can_get_values_for_all(self): results = get_lazy_session_table_properties_v1(None) for prop in results: - get_lazy_session_table_values_v1(key=prop["id"], team=self.team, search_term=None) + get_lazy_session_table_values_v1(key=prop["id"], team=TEAM, search_term=None) diff --git a/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py index 3243f977415a4..73459b375879e 100644 --- a/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_person_where_clause_extractor.py @@ -24,7 +24,7 @@ def _expr(s: Union[str, ast.Expr, None], placeholders: Optional[dict[str, ast.Ex def _select( s: str, placeholders: Optional[dict[str, ast.Expr]] = None, -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: parsed = parse_select(s, placeholders=placeholders) return parsed diff --git a/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py index b1076a60aeb4f..dc789e80d7458 100644 --- a/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_session_v2_where_clause_extractor.py @@ -26,7 +26,7 @@ def f(s: Union[str, ast.Expr, None], placeholders: Optional[dict[str, ast.Expr]] def parse( s: str, placeholders: Optional[dict[str, ast.Expr]] = None, -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: parsed = parse_select(s, placeholders=placeholders) return parsed @@ -363,7 +363,8 @@ def print_query(self, query: str) -> str: def test_select_with_timestamp(self): actual = self.print_query("SELECT session_id FROM sessions WHERE $start_timestamp > '2021-01-01'") - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT sessions.session_id AS session_id FROM @@ -381,7 +382,8 @@ def test_select_with_timestamp(self): WHERE ifNull(greater(sessions.`$start_timestamp`, %(hogql_val_2)s), 0) LIMIT 50000\ -""") +""" + ) def test_join_with_events(self): actual = self.print_query( @@ -396,7 +398,8 @@ def test_join_with_events(self): GROUP BY sessions.session_id """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT sessions.session_id AS session_id, uniq(events.uuid) @@ -417,7 +420,8 @@ def test_join_with_events(self): GROUP BY sessions.session_id LIMIT 50000\ -""") +""" + ) def test_union(self): actual = self.print_query( @@ -429,7 +433,8 @@ def test_union(self): WHERE events.timestamp < today() """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT 0 AS duration LIMIT 50000 @@ -451,7 +456,8 @@ def test_union(self): WHERE and(equals(events.team_id, ), less(toTimeZone(events.timestamp, %(hogql_val_4)s), today())) LIMIT 50000\ -""") +""" + ) def test_session_breakdown(self): actual = self.print_query( @@ -495,7 +501,8 @@ def test_session_breakdown(self): GROUP BY day_start, breakdown_value""" ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT count(DISTINCT e.`$session_id`) AS total, toStartOfDay(toTimeZone(e.timestamp, %(hogql_val_8)s)) AS day_start, @@ -535,7 +542,8 @@ def test_session_breakdown(self): day_start, breakdown_value LIMIT 50000\ -""") +""" + ) def test_session_replay_query(self): actual = self.print_query( @@ -548,7 +556,8 @@ def test_session_replay_query(self): GROUP BY session_id """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT s.session_id AS session_id, min(toTimeZone(s.min_first_timestamp, %(hogql_val_5)s)) AS start_time @@ -569,7 +578,8 @@ def test_session_replay_query(self): GROUP BY s.session_id LIMIT 50000\ -""") +""" + ) def test_urls_in_sessions_in_timestamp_query(self): actual = self.print_query( @@ -582,7 +592,8 @@ def test_urls_in_sessions_in_timestamp_query(self): where `$start_timestamp` >= now() - toIntervalDay(7) """ ) - assert self.generalize_sql(actual) == snapshot("""\ + assert self.generalize_sql(actual) == snapshot( + """\ SELECT sessions.session_id AS session_id, sessions.`$urls` AS `$urls`, @@ -603,4 +614,5 @@ def test_urls_in_sessions_in_timestamp_query(self): WHERE ifNull(greaterOrEquals(sessions.`$start_timestamp`, minus(now64(6, %(hogql_val_2)s), toIntervalDay(7))), 0) LIMIT 50000\ -""") +""" + ) diff --git a/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py b/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py index b1304fc53510b..a514af84ae8a7 100644 --- a/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py +++ b/posthog/hogql/database/schema/util/test/test_session_where_clause_extractor.py @@ -26,7 +26,7 @@ def f(s: Union[str, ast.Expr, None], placeholders: Optional[dict[str, ast.Expr]] def parse( s: str, placeholders: Optional[dict[str, ast.Expr]] = None, -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: parsed = parse_select(s, placeholders=placeholders) return parsed diff --git a/posthog/hogql/grammar/HogQLLexer.g4 b/posthog/hogql/grammar/HogQLLexer.g4 index 6241425a64f2c..f4caeaf8df056 100644 --- a/posthog/hogql/grammar/HogQLLexer.g4 +++ b/posthog/hogql/grammar/HogQLLexer.g4 @@ -30,6 +30,7 @@ DESCENDING: D E S C E N D I N G; DISTINCT: D I S T I N C T; ELSE: E L S E; END: E N D; +EXCEPT: E X C E P T; EXTRACT: E X T R A C T; FINAL: F I N A L; FINALLY: F I N A L L Y; @@ -49,6 +50,7 @@ ILIKE: I L I K E; IN: I N; INF: I N F | I N F I N I T Y; INNER: I N N E R; +INTERSECT: I N T E R S E C T; INTERVAL: I N T E R V A L; IS: I S; JOIN: J O I N; diff --git a/posthog/hogql/grammar/HogQLLexer.interp b/posthog/hogql/grammar/HogQLLexer.interp index dc4c26657342d..f461a8e011b30 100644 --- a/posthog/hogql/grammar/HogQLLexer.interp +++ b/posthog/hogql/grammar/HogQLLexer.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -351,6 +355,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -370,6 +375,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -527,4 +533,4 @@ IN_TEMPLATE_STRING IN_FULL_TEMPLATE_STRING atn: -[4, 0, 160, 1455, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 426, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 647, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 3, 103, 1021, 8, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 3, 104, 1050, 8, 104, 1, 105, 1, 105, 1, 105, 3, 105, 1055, 8, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1061, 8, 105, 10, 105, 12, 105, 1064, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1075, 8, 105, 10, 105, 12, 105, 1078, 9, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 5, 105, 1091, 8, 105, 10, 105, 12, 105, 1094, 9, 105, 1, 105, 1, 105, 3, 105, 1098, 8, 105, 1, 106, 1, 106, 1, 106, 5, 106, 1103, 8, 106, 10, 106, 12, 106, 1106, 9, 106, 1, 106, 1, 106, 3, 106, 1110, 8, 106, 1, 106, 1, 106, 3, 106, 1114, 8, 106, 1, 106, 4, 106, 1117, 8, 106, 11, 106, 12, 106, 1118, 1, 106, 1, 106, 1, 106, 3, 106, 1124, 8, 106, 1, 106, 1, 106, 3, 106, 1128, 8, 106, 1, 106, 4, 106, 1131, 8, 106, 11, 106, 12, 106, 1132, 1, 106, 1, 106, 1, 106, 5, 106, 1138, 8, 106, 10, 106, 12, 106, 1141, 9, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1146, 8, 106, 1, 106, 4, 106, 1149, 8, 106, 11, 106, 12, 106, 1150, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1158, 8, 106, 1, 106, 4, 106, 1161, 8, 106, 11, 106, 12, 106, 1162, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1169, 8, 106, 1, 106, 4, 106, 1172, 8, 106, 11, 106, 12, 106, 1173, 3, 106, 1176, 8, 106, 1, 107, 1, 107, 4, 107, 1180, 8, 107, 11, 107, 12, 107, 1181, 1, 108, 4, 108, 1185, 8, 108, 11, 108, 12, 108, 1186, 1, 109, 1, 109, 1, 109, 4, 109, 1192, 8, 109, 11, 109, 12, 109, 1193, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 1, 110, 5, 110, 1205, 8, 110, 10, 110, 12, 110, 1208, 9, 110, 1, 110, 1, 110, 1, 111, 1, 111, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 156, 1, 156, 1, 156, 1, 157, 1, 157, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 160, 1, 160, 1, 161, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 163, 3, 163, 1330, 8, 163, 1, 164, 1, 164, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 172, 1, 172, 1, 172, 1, 173, 1, 173, 1, 173, 1, 173, 1, 173, 1, 174, 1, 174, 1, 175, 1, 175, 1, 176, 1, 176, 1, 176, 1, 177, 1, 177, 1, 177, 1, 177, 1, 178, 1, 178, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 183, 1, 183, 5, 183, 1388, 8, 183, 10, 183, 12, 183, 1391, 9, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 183, 1, 184, 1, 184, 1, 184, 1, 184, 3, 184, 1402, 8, 184, 1, 184, 5, 184, 1405, 8, 184, 10, 184, 12, 184, 1408, 9, 184, 1, 184, 3, 184, 1411, 8, 184, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 1, 186, 4, 186, 1430, 8, 186, 11, 186, 12, 186, 1431, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 189, 1, 189, 1, 189, 1, 189, 1, 189, 4, 189, 1448, 8, 189, 11, 189, 12, 189, 1449, 1, 190, 1, 190, 1, 190, 1, 190, 1, 1389, 0, 191, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 0, 227, 0, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 112, 287, 113, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 0, 381, 159, 383, 160, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1491, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 285, 1, 0, 0, 0, 0, 287, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 1, 375, 1, 0, 0, 0, 1, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 2, 381, 1, 0, 0, 0, 2, 383, 1, 0, 0, 0, 3, 385, 1, 0, 0, 0, 5, 389, 1, 0, 0, 0, 7, 393, 1, 0, 0, 0, 9, 398, 1, 0, 0, 0, 11, 402, 1, 0, 0, 0, 13, 408, 1, 0, 0, 0, 15, 425, 1, 0, 0, 0, 17, 427, 1, 0, 0, 0, 19, 432, 1, 0, 0, 0, 21, 440, 1, 0, 0, 0, 23, 445, 1, 0, 0, 0, 25, 448, 1, 0, 0, 0, 27, 453, 1, 0, 0, 0, 29, 458, 1, 0, 0, 0, 31, 464, 1, 0, 0, 0, 33, 471, 1, 0, 0, 0, 35, 479, 1, 0, 0, 0, 37, 485, 1, 0, 0, 0, 39, 490, 1, 0, 0, 0, 41, 498, 1, 0, 0, 0, 43, 503, 1, 0, 0, 0, 45, 507, 1, 0, 0, 0, 47, 512, 1, 0, 0, 0, 49, 523, 1, 0, 0, 0, 51, 532, 1, 0, 0, 0, 53, 537, 1, 0, 0, 0, 55, 541, 1, 0, 0, 0, 57, 549, 1, 0, 0, 0, 59, 555, 1, 0, 0, 0, 61, 563, 1, 0, 0, 0, 63, 569, 1, 0, 0, 0, 65, 572, 1, 0, 0, 0, 67, 582, 1, 0, 0, 0, 69, 586, 1, 0, 0, 0, 71, 591, 1, 0, 0, 0, 73, 596, 1, 0, 0, 0, 75, 600, 1, 0, 0, 0, 77, 606, 1, 0, 0, 0, 79, 613, 1, 0, 0, 0, 81, 618, 1, 0, 0, 0, 83, 621, 1, 0, 0, 0, 85, 624, 1, 0, 0, 0, 87, 630, 1, 0, 0, 0, 89, 646, 1, 0, 0, 0, 91, 648, 1, 0, 0, 0, 93, 654, 1, 0, 0, 0, 95, 663, 1, 0, 0, 0, 97, 666, 1, 0, 0, 0, 99, 671, 1, 0, 0, 0, 101, 675, 1, 0, 0, 0, 103, 680, 1, 0, 0, 0, 105, 688, 1, 0, 0, 0, 107, 693, 1, 0, 0, 0, 109, 697, 1, 0, 0, 0, 111, 702, 1, 0, 0, 0, 113, 708, 1, 0, 0, 0, 115, 715, 1, 0, 0, 0, 117, 721, 1, 0, 0, 0, 119, 725, 1, 0, 0, 0, 121, 729, 1, 0, 0, 0, 123, 734, 1, 0, 0, 0, 125, 740, 1, 0, 0, 0, 127, 747, 1, 0, 0, 0, 129, 750, 1, 0, 0, 0, 131, 753, 1, 0, 0, 0, 133, 759, 1, 0, 0, 0, 135, 765, 1, 0, 0, 0, 137, 770, 1, 0, 0, 0, 139, 780, 1, 0, 0, 0, 141, 790, 1, 0, 0, 0, 143, 799, 1, 0, 0, 0, 145, 807, 1, 0, 0, 0, 147, 813, 1, 0, 0, 0, 149, 820, 1, 0, 0, 0, 151, 826, 1, 0, 0, 0, 153, 833, 1, 0, 0, 0, 155, 837, 1, 0, 0, 0, 157, 842, 1, 0, 0, 0, 159, 849, 1, 0, 0, 0, 161, 856, 1, 0, 0, 0, 163, 863, 1, 0, 0, 0, 165, 868, 1, 0, 0, 0, 167, 877, 1, 0, 0, 0, 169, 887, 1, 0, 0, 0, 171, 892, 1, 0, 0, 0, 173, 898, 1, 0, 0, 0, 175, 903, 1, 0, 0, 0, 177, 913, 1, 0, 0, 0, 179, 916, 1, 0, 0, 0, 181, 920, 1, 0, 0, 0, 183, 927, 1, 0, 0, 0, 185, 936, 1, 0, 0, 0, 187, 941, 1, 0, 0, 0, 189, 950, 1, 0, 0, 0, 191, 954, 1, 0, 0, 0, 193, 964, 1, 0, 0, 0, 195, 970, 1, 0, 0, 0, 197, 976, 1, 0, 0, 0, 199, 981, 1, 0, 0, 0, 201, 986, 1, 0, 0, 0, 203, 992, 1, 0, 0, 0, 205, 998, 1, 0, 0, 0, 207, 1005, 1, 0, 0, 0, 209, 1020, 1, 0, 0, 0, 211, 1049, 1, 0, 0, 0, 213, 1097, 1, 0, 0, 0, 215, 1175, 1, 0, 0, 0, 217, 1177, 1, 0, 0, 0, 219, 1184, 1, 0, 0, 0, 221, 1188, 1, 0, 0, 0, 223, 1195, 1, 0, 0, 0, 225, 1211, 1, 0, 0, 0, 227, 1213, 1, 0, 0, 0, 229, 1215, 1, 0, 0, 0, 231, 1217, 1, 0, 0, 0, 233, 1219, 1, 0, 0, 0, 235, 1221, 1, 0, 0, 0, 237, 1223, 1, 0, 0, 0, 239, 1225, 1, 0, 0, 0, 241, 1227, 1, 0, 0, 0, 243, 1229, 1, 0, 0, 0, 245, 1231, 1, 0, 0, 0, 247, 1233, 1, 0, 0, 0, 249, 1235, 1, 0, 0, 0, 251, 1237, 1, 0, 0, 0, 253, 1239, 1, 0, 0, 0, 255, 1241, 1, 0, 0, 0, 257, 1243, 1, 0, 0, 0, 259, 1245, 1, 0, 0, 0, 261, 1247, 1, 0, 0, 0, 263, 1249, 1, 0, 0, 0, 265, 1251, 1, 0, 0, 0, 267, 1253, 1, 0, 0, 0, 269, 1255, 1, 0, 0, 0, 271, 1257, 1, 0, 0, 0, 273, 1259, 1, 0, 0, 0, 275, 1261, 1, 0, 0, 0, 277, 1263, 1, 0, 0, 0, 279, 1265, 1, 0, 0, 0, 281, 1267, 1, 0, 0, 0, 283, 1269, 1, 0, 0, 0, 285, 1271, 1, 0, 0, 0, 287, 1274, 1, 0, 0, 0, 289, 1276, 1, 0, 0, 0, 291, 1278, 1, 0, 0, 0, 293, 1280, 1, 0, 0, 0, 295, 1282, 1, 0, 0, 0, 297, 1284, 1, 0, 0, 0, 299, 1287, 1, 0, 0, 0, 301, 1289, 1, 0, 0, 0, 303, 1291, 1, 0, 0, 0, 305, 1293, 1, 0, 0, 0, 307, 1296, 1, 0, 0, 0, 309, 1298, 1, 0, 0, 0, 311, 1301, 1, 0, 0, 0, 313, 1303, 1, 0, 0, 0, 315, 1305, 1, 0, 0, 0, 317, 1308, 1, 0, 0, 0, 319, 1312, 1, 0, 0, 0, 321, 1316, 1, 0, 0, 0, 323, 1318, 1, 0, 0, 0, 325, 1320, 1, 0, 0, 0, 327, 1323, 1, 0, 0, 0, 329, 1329, 1, 0, 0, 0, 331, 1331, 1, 0, 0, 0, 333, 1335, 1, 0, 0, 0, 335, 1338, 1, 0, 0, 0, 337, 1341, 1, 0, 0, 0, 339, 1344, 1, 0, 0, 0, 341, 1346, 1, 0, 0, 0, 343, 1348, 1, 0, 0, 0, 345, 1350, 1, 0, 0, 0, 347, 1352, 1, 0, 0, 0, 349, 1357, 1, 0, 0, 0, 351, 1362, 1, 0, 0, 0, 353, 1364, 1, 0, 0, 0, 355, 1366, 1, 0, 0, 0, 357, 1369, 1, 0, 0, 0, 359, 1373, 1, 0, 0, 0, 361, 1375, 1, 0, 0, 0, 363, 1377, 1, 0, 0, 0, 365, 1379, 1, 0, 0, 0, 367, 1381, 1, 0, 0, 0, 369, 1383, 1, 0, 0, 0, 371, 1401, 1, 0, 0, 0, 373, 1414, 1, 0, 0, 0, 375, 1429, 1, 0, 0, 0, 377, 1433, 1, 0, 0, 0, 379, 1437, 1, 0, 0, 0, 381, 1447, 1, 0, 0, 0, 383, 1451, 1, 0, 0, 0, 385, 386, 3, 225, 111, 0, 386, 387, 3, 247, 122, 0, 387, 388, 3, 247, 122, 0, 388, 4, 1, 0, 0, 0, 389, 390, 3, 225, 111, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 231, 114, 0, 392, 6, 1, 0, 0, 0, 393, 394, 3, 225, 111, 0, 394, 395, 3, 251, 124, 0, 395, 396, 3, 263, 130, 0, 396, 397, 3, 241, 119, 0, 397, 8, 1, 0, 0, 0, 398, 399, 3, 225, 111, 0, 399, 400, 3, 251, 124, 0, 400, 401, 3, 273, 135, 0, 401, 10, 1, 0, 0, 0, 402, 403, 3, 225, 111, 0, 403, 404, 3, 259, 128, 0, 404, 405, 3, 259, 128, 0, 405, 406, 3, 225, 111, 0, 406, 407, 3, 273, 135, 0, 407, 12, 1, 0, 0, 0, 408, 409, 3, 225, 111, 0, 409, 410, 3, 261, 129, 0, 410, 14, 1, 0, 0, 0, 411, 412, 3, 225, 111, 0, 412, 413, 3, 261, 129, 0, 413, 414, 3, 229, 113, 0, 414, 426, 1, 0, 0, 0, 415, 416, 3, 225, 111, 0, 416, 417, 3, 261, 129, 0, 417, 418, 3, 229, 113, 0, 418, 419, 3, 233, 115, 0, 419, 420, 3, 251, 124, 0, 420, 421, 3, 231, 114, 0, 421, 422, 3, 241, 119, 0, 422, 423, 3, 251, 124, 0, 423, 424, 3, 237, 117, 0, 424, 426, 1, 0, 0, 0, 425, 411, 1, 0, 0, 0, 425, 415, 1, 0, 0, 0, 426, 16, 1, 0, 0, 0, 427, 428, 3, 225, 111, 0, 428, 429, 3, 261, 129, 0, 429, 430, 3, 253, 125, 0, 430, 431, 3, 235, 116, 0, 431, 18, 1, 0, 0, 0, 432, 433, 3, 227, 112, 0, 433, 434, 3, 233, 115, 0, 434, 435, 3, 263, 130, 0, 435, 436, 3, 269, 133, 0, 436, 437, 3, 233, 115, 0, 437, 438, 3, 233, 115, 0, 438, 439, 3, 251, 124, 0, 439, 20, 1, 0, 0, 0, 440, 441, 3, 227, 112, 0, 441, 442, 3, 253, 125, 0, 442, 443, 3, 263, 130, 0, 443, 444, 3, 239, 118, 0, 444, 22, 1, 0, 0, 0, 445, 446, 3, 227, 112, 0, 446, 447, 3, 273, 135, 0, 447, 24, 1, 0, 0, 0, 448, 449, 3, 229, 113, 0, 449, 450, 3, 225, 111, 0, 450, 451, 3, 261, 129, 0, 451, 452, 3, 233, 115, 0, 452, 26, 1, 0, 0, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 225, 111, 0, 455, 456, 3, 261, 129, 0, 456, 457, 3, 263, 130, 0, 457, 28, 1, 0, 0, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 225, 111, 0, 460, 461, 3, 263, 130, 0, 461, 462, 3, 229, 113, 0, 462, 463, 3, 239, 118, 0, 463, 30, 1, 0, 0, 0, 464, 465, 3, 229, 113, 0, 465, 466, 3, 253, 125, 0, 466, 467, 3, 239, 118, 0, 467, 468, 3, 253, 125, 0, 468, 469, 3, 259, 128, 0, 469, 470, 3, 263, 130, 0, 470, 32, 1, 0, 0, 0, 471, 472, 3, 229, 113, 0, 472, 473, 3, 253, 125, 0, 473, 474, 3, 247, 122, 0, 474, 475, 3, 247, 122, 0, 475, 476, 3, 225, 111, 0, 476, 477, 3, 263, 130, 0, 477, 478, 3, 233, 115, 0, 478, 34, 1, 0, 0, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 259, 128, 0, 481, 482, 3, 253, 125, 0, 482, 483, 3, 261, 129, 0, 483, 484, 3, 261, 129, 0, 484, 36, 1, 0, 0, 0, 485, 486, 3, 229, 113, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 227, 112, 0, 488, 489, 3, 233, 115, 0, 489, 38, 1, 0, 0, 0, 490, 491, 3, 229, 113, 0, 491, 492, 3, 265, 131, 0, 492, 493, 3, 259, 128, 0, 493, 494, 3, 259, 128, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 251, 124, 0, 496, 497, 3, 263, 130, 0, 497, 40, 1, 0, 0, 0, 498, 499, 3, 231, 114, 0, 499, 500, 3, 225, 111, 0, 500, 501, 3, 263, 130, 0, 501, 502, 3, 233, 115, 0, 502, 42, 1, 0, 0, 0, 503, 504, 3, 231, 114, 0, 504, 505, 3, 225, 111, 0, 505, 506, 3, 273, 135, 0, 506, 44, 1, 0, 0, 0, 507, 508, 3, 231, 114, 0, 508, 509, 3, 233, 115, 0, 509, 510, 3, 261, 129, 0, 510, 511, 3, 229, 113, 0, 511, 46, 1, 0, 0, 0, 512, 513, 3, 231, 114, 0, 513, 514, 3, 233, 115, 0, 514, 515, 3, 261, 129, 0, 515, 516, 3, 229, 113, 0, 516, 517, 3, 233, 115, 0, 517, 518, 3, 251, 124, 0, 518, 519, 3, 231, 114, 0, 519, 520, 3, 241, 119, 0, 520, 521, 3, 251, 124, 0, 521, 522, 3, 237, 117, 0, 522, 48, 1, 0, 0, 0, 523, 524, 3, 231, 114, 0, 524, 525, 3, 241, 119, 0, 525, 526, 3, 261, 129, 0, 526, 527, 3, 263, 130, 0, 527, 528, 3, 241, 119, 0, 528, 529, 3, 251, 124, 0, 529, 530, 3, 229, 113, 0, 530, 531, 3, 263, 130, 0, 531, 50, 1, 0, 0, 0, 532, 533, 3, 233, 115, 0, 533, 534, 3, 247, 122, 0, 534, 535, 3, 261, 129, 0, 535, 536, 3, 233, 115, 0, 536, 52, 1, 0, 0, 0, 537, 538, 3, 233, 115, 0, 538, 539, 3, 251, 124, 0, 539, 540, 3, 231, 114, 0, 540, 54, 1, 0, 0, 0, 541, 542, 3, 233, 115, 0, 542, 543, 3, 271, 134, 0, 543, 544, 3, 263, 130, 0, 544, 545, 3, 259, 128, 0, 545, 546, 3, 225, 111, 0, 546, 547, 3, 229, 113, 0, 547, 548, 3, 263, 130, 0, 548, 56, 1, 0, 0, 0, 549, 550, 3, 235, 116, 0, 550, 551, 3, 241, 119, 0, 551, 552, 3, 251, 124, 0, 552, 553, 3, 225, 111, 0, 553, 554, 3, 247, 122, 0, 554, 58, 1, 0, 0, 0, 555, 556, 3, 235, 116, 0, 556, 557, 3, 241, 119, 0, 557, 558, 3, 251, 124, 0, 558, 559, 3, 225, 111, 0, 559, 560, 3, 247, 122, 0, 560, 561, 3, 247, 122, 0, 561, 562, 3, 273, 135, 0, 562, 60, 1, 0, 0, 0, 563, 564, 3, 235, 116, 0, 564, 565, 3, 241, 119, 0, 565, 566, 3, 259, 128, 0, 566, 567, 3, 261, 129, 0, 567, 568, 3, 263, 130, 0, 568, 62, 1, 0, 0, 0, 569, 570, 3, 235, 116, 0, 570, 571, 3, 251, 124, 0, 571, 64, 1, 0, 0, 0, 572, 573, 3, 235, 116, 0, 573, 574, 3, 253, 125, 0, 574, 575, 3, 247, 122, 0, 575, 576, 3, 247, 122, 0, 576, 577, 3, 253, 125, 0, 577, 578, 3, 269, 133, 0, 578, 579, 3, 241, 119, 0, 579, 580, 3, 251, 124, 0, 580, 581, 3, 237, 117, 0, 581, 66, 1, 0, 0, 0, 582, 583, 3, 235, 116, 0, 583, 584, 3, 253, 125, 0, 584, 585, 3, 259, 128, 0, 585, 68, 1, 0, 0, 0, 586, 587, 3, 235, 116, 0, 587, 588, 3, 259, 128, 0, 588, 589, 3, 253, 125, 0, 589, 590, 3, 249, 123, 0, 590, 70, 1, 0, 0, 0, 591, 592, 3, 235, 116, 0, 592, 593, 3, 265, 131, 0, 593, 594, 3, 247, 122, 0, 594, 595, 3, 247, 122, 0, 595, 72, 1, 0, 0, 0, 596, 597, 3, 235, 116, 0, 597, 598, 3, 265, 131, 0, 598, 599, 3, 251, 124, 0, 599, 74, 1, 0, 0, 0, 600, 601, 3, 237, 117, 0, 601, 602, 3, 259, 128, 0, 602, 603, 3, 253, 125, 0, 603, 604, 3, 265, 131, 0, 604, 605, 3, 255, 126, 0, 605, 76, 1, 0, 0, 0, 606, 607, 3, 239, 118, 0, 607, 608, 3, 225, 111, 0, 608, 609, 3, 267, 132, 0, 609, 610, 3, 241, 119, 0, 610, 611, 3, 251, 124, 0, 611, 612, 3, 237, 117, 0, 612, 78, 1, 0, 0, 0, 613, 614, 3, 239, 118, 0, 614, 615, 3, 253, 125, 0, 615, 616, 3, 265, 131, 0, 616, 617, 3, 259, 128, 0, 617, 80, 1, 0, 0, 0, 618, 619, 3, 241, 119, 0, 619, 620, 3, 231, 114, 0, 620, 82, 1, 0, 0, 0, 621, 622, 3, 241, 119, 0, 622, 623, 3, 235, 116, 0, 623, 84, 1, 0, 0, 0, 624, 625, 3, 241, 119, 0, 625, 626, 3, 247, 122, 0, 626, 627, 3, 241, 119, 0, 627, 628, 3, 245, 121, 0, 628, 629, 3, 233, 115, 0, 629, 86, 1, 0, 0, 0, 630, 631, 3, 241, 119, 0, 631, 632, 3, 251, 124, 0, 632, 88, 1, 0, 0, 0, 633, 634, 3, 241, 119, 0, 634, 635, 3, 251, 124, 0, 635, 636, 3, 235, 116, 0, 636, 647, 1, 0, 0, 0, 637, 638, 3, 241, 119, 0, 638, 639, 3, 251, 124, 0, 639, 640, 3, 235, 116, 0, 640, 641, 3, 241, 119, 0, 641, 642, 3, 251, 124, 0, 642, 643, 3, 241, 119, 0, 643, 644, 3, 263, 130, 0, 644, 645, 3, 273, 135, 0, 645, 647, 1, 0, 0, 0, 646, 633, 1, 0, 0, 0, 646, 637, 1, 0, 0, 0, 647, 90, 1, 0, 0, 0, 648, 649, 3, 241, 119, 0, 649, 650, 3, 251, 124, 0, 650, 651, 3, 251, 124, 0, 651, 652, 3, 233, 115, 0, 652, 653, 3, 259, 128, 0, 653, 92, 1, 0, 0, 0, 654, 655, 3, 241, 119, 0, 655, 656, 3, 251, 124, 0, 656, 657, 3, 263, 130, 0, 657, 658, 3, 233, 115, 0, 658, 659, 3, 259, 128, 0, 659, 660, 3, 267, 132, 0, 660, 661, 3, 225, 111, 0, 661, 662, 3, 247, 122, 0, 662, 94, 1, 0, 0, 0, 663, 664, 3, 241, 119, 0, 664, 665, 3, 261, 129, 0, 665, 96, 1, 0, 0, 0, 666, 667, 3, 243, 120, 0, 667, 668, 3, 253, 125, 0, 668, 669, 3, 241, 119, 0, 669, 670, 3, 251, 124, 0, 670, 98, 1, 0, 0, 0, 671, 672, 3, 245, 121, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 273, 135, 0, 674, 100, 1, 0, 0, 0, 675, 676, 3, 247, 122, 0, 676, 677, 3, 225, 111, 0, 677, 678, 3, 261, 129, 0, 678, 679, 3, 263, 130, 0, 679, 102, 1, 0, 0, 0, 680, 681, 3, 247, 122, 0, 681, 682, 3, 233, 115, 0, 682, 683, 3, 225, 111, 0, 683, 684, 3, 231, 114, 0, 684, 685, 3, 241, 119, 0, 685, 686, 3, 251, 124, 0, 686, 687, 3, 237, 117, 0, 687, 104, 1, 0, 0, 0, 688, 689, 3, 247, 122, 0, 689, 690, 3, 233, 115, 0, 690, 691, 3, 235, 116, 0, 691, 692, 3, 263, 130, 0, 692, 106, 1, 0, 0, 0, 693, 694, 3, 247, 122, 0, 694, 695, 3, 233, 115, 0, 695, 696, 3, 263, 130, 0, 696, 108, 1, 0, 0, 0, 697, 698, 3, 247, 122, 0, 698, 699, 3, 241, 119, 0, 699, 700, 3, 245, 121, 0, 700, 701, 3, 233, 115, 0, 701, 110, 1, 0, 0, 0, 702, 703, 3, 247, 122, 0, 703, 704, 3, 241, 119, 0, 704, 705, 3, 249, 123, 0, 705, 706, 3, 241, 119, 0, 706, 707, 3, 263, 130, 0, 707, 112, 1, 0, 0, 0, 708, 709, 3, 249, 123, 0, 709, 710, 3, 241, 119, 0, 710, 711, 3, 251, 124, 0, 711, 712, 3, 265, 131, 0, 712, 713, 3, 263, 130, 0, 713, 714, 3, 233, 115, 0, 714, 114, 1, 0, 0, 0, 715, 716, 3, 249, 123, 0, 716, 717, 3, 253, 125, 0, 717, 718, 3, 251, 124, 0, 718, 719, 3, 263, 130, 0, 719, 720, 3, 239, 118, 0, 720, 116, 1, 0, 0, 0, 721, 722, 3, 251, 124, 0, 722, 723, 3, 225, 111, 0, 723, 724, 3, 251, 124, 0, 724, 118, 1, 0, 0, 0, 725, 726, 3, 251, 124, 0, 726, 727, 3, 253, 125, 0, 727, 728, 3, 263, 130, 0, 728, 120, 1, 0, 0, 0, 729, 730, 3, 251, 124, 0, 730, 731, 3, 265, 131, 0, 731, 732, 3, 247, 122, 0, 732, 733, 3, 247, 122, 0, 733, 122, 1, 0, 0, 0, 734, 735, 3, 251, 124, 0, 735, 736, 3, 265, 131, 0, 736, 737, 3, 247, 122, 0, 737, 738, 3, 247, 122, 0, 738, 739, 3, 261, 129, 0, 739, 124, 1, 0, 0, 0, 740, 741, 3, 253, 125, 0, 741, 742, 3, 235, 116, 0, 742, 743, 3, 235, 116, 0, 743, 744, 3, 261, 129, 0, 744, 745, 3, 233, 115, 0, 745, 746, 3, 263, 130, 0, 746, 126, 1, 0, 0, 0, 747, 748, 3, 253, 125, 0, 748, 749, 3, 251, 124, 0, 749, 128, 1, 0, 0, 0, 750, 751, 3, 253, 125, 0, 751, 752, 3, 259, 128, 0, 752, 130, 1, 0, 0, 0, 753, 754, 3, 253, 125, 0, 754, 755, 3, 259, 128, 0, 755, 756, 3, 231, 114, 0, 756, 757, 3, 233, 115, 0, 757, 758, 3, 259, 128, 0, 758, 132, 1, 0, 0, 0, 759, 760, 3, 253, 125, 0, 760, 761, 3, 265, 131, 0, 761, 762, 3, 263, 130, 0, 762, 763, 3, 233, 115, 0, 763, 764, 3, 259, 128, 0, 764, 134, 1, 0, 0, 0, 765, 766, 3, 253, 125, 0, 766, 767, 3, 267, 132, 0, 767, 768, 3, 233, 115, 0, 768, 769, 3, 259, 128, 0, 769, 136, 1, 0, 0, 0, 770, 771, 3, 255, 126, 0, 771, 772, 3, 225, 111, 0, 772, 773, 3, 259, 128, 0, 773, 774, 3, 263, 130, 0, 774, 775, 3, 241, 119, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 241, 119, 0, 777, 778, 3, 253, 125, 0, 778, 779, 3, 251, 124, 0, 779, 138, 1, 0, 0, 0, 780, 781, 3, 255, 126, 0, 781, 782, 3, 259, 128, 0, 782, 783, 3, 233, 115, 0, 783, 784, 3, 229, 113, 0, 784, 785, 3, 233, 115, 0, 785, 786, 3, 231, 114, 0, 786, 787, 3, 241, 119, 0, 787, 788, 3, 251, 124, 0, 788, 789, 3, 237, 117, 0, 789, 140, 1, 0, 0, 0, 790, 791, 3, 255, 126, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 233, 115, 0, 793, 794, 3, 269, 133, 0, 794, 795, 3, 239, 118, 0, 795, 796, 3, 233, 115, 0, 796, 797, 3, 259, 128, 0, 797, 798, 3, 233, 115, 0, 798, 142, 1, 0, 0, 0, 799, 800, 3, 257, 127, 0, 800, 801, 3, 265, 131, 0, 801, 802, 3, 225, 111, 0, 802, 803, 3, 259, 128, 0, 803, 804, 3, 263, 130, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 259, 128, 0, 806, 144, 1, 0, 0, 0, 807, 808, 3, 259, 128, 0, 808, 809, 3, 225, 111, 0, 809, 810, 3, 251, 124, 0, 810, 811, 3, 237, 117, 0, 811, 812, 3, 233, 115, 0, 812, 146, 1, 0, 0, 0, 813, 814, 3, 259, 128, 0, 814, 815, 3, 233, 115, 0, 815, 816, 3, 263, 130, 0, 816, 817, 3, 265, 131, 0, 817, 818, 3, 259, 128, 0, 818, 819, 3, 251, 124, 0, 819, 148, 1, 0, 0, 0, 820, 821, 3, 259, 128, 0, 821, 822, 3, 241, 119, 0, 822, 823, 3, 237, 117, 0, 823, 824, 3, 239, 118, 0, 824, 825, 3, 263, 130, 0, 825, 150, 1, 0, 0, 0, 826, 827, 3, 259, 128, 0, 827, 828, 3, 253, 125, 0, 828, 829, 3, 247, 122, 0, 829, 830, 3, 247, 122, 0, 830, 831, 3, 265, 131, 0, 831, 832, 3, 255, 126, 0, 832, 152, 1, 0, 0, 0, 833, 834, 3, 259, 128, 0, 834, 835, 3, 253, 125, 0, 835, 836, 3, 269, 133, 0, 836, 154, 1, 0, 0, 0, 837, 838, 3, 259, 128, 0, 838, 839, 3, 253, 125, 0, 839, 840, 3, 269, 133, 0, 840, 841, 3, 261, 129, 0, 841, 156, 1, 0, 0, 0, 842, 843, 3, 261, 129, 0, 843, 844, 3, 225, 111, 0, 844, 845, 3, 249, 123, 0, 845, 846, 3, 255, 126, 0, 846, 847, 3, 247, 122, 0, 847, 848, 3, 233, 115, 0, 848, 158, 1, 0, 0, 0, 849, 850, 3, 261, 129, 0, 850, 851, 3, 233, 115, 0, 851, 852, 3, 229, 113, 0, 852, 853, 3, 253, 125, 0, 853, 854, 3, 251, 124, 0, 854, 855, 3, 231, 114, 0, 855, 160, 1, 0, 0, 0, 856, 857, 3, 261, 129, 0, 857, 858, 3, 233, 115, 0, 858, 859, 3, 247, 122, 0, 859, 860, 3, 233, 115, 0, 860, 861, 3, 229, 113, 0, 861, 862, 3, 263, 130, 0, 862, 162, 1, 0, 0, 0, 863, 864, 3, 261, 129, 0, 864, 865, 3, 233, 115, 0, 865, 866, 3, 249, 123, 0, 866, 867, 3, 241, 119, 0, 867, 164, 1, 0, 0, 0, 868, 869, 3, 261, 129, 0, 869, 870, 3, 233, 115, 0, 870, 871, 3, 263, 130, 0, 871, 872, 3, 263, 130, 0, 872, 873, 3, 241, 119, 0, 873, 874, 3, 251, 124, 0, 874, 875, 3, 237, 117, 0, 875, 876, 3, 261, 129, 0, 876, 166, 1, 0, 0, 0, 877, 878, 3, 261, 129, 0, 878, 879, 3, 265, 131, 0, 879, 880, 3, 227, 112, 0, 880, 881, 3, 261, 129, 0, 881, 882, 3, 263, 130, 0, 882, 883, 3, 259, 128, 0, 883, 884, 3, 241, 119, 0, 884, 885, 3, 251, 124, 0, 885, 886, 3, 237, 117, 0, 886, 168, 1, 0, 0, 0, 887, 888, 3, 263, 130, 0, 888, 889, 3, 239, 118, 0, 889, 890, 3, 233, 115, 0, 890, 891, 3, 251, 124, 0, 891, 170, 1, 0, 0, 0, 892, 893, 3, 263, 130, 0, 893, 894, 3, 239, 118, 0, 894, 895, 3, 259, 128, 0, 895, 896, 3, 253, 125, 0, 896, 897, 3, 269, 133, 0, 897, 172, 1, 0, 0, 0, 898, 899, 3, 263, 130, 0, 899, 900, 3, 241, 119, 0, 900, 901, 3, 233, 115, 0, 901, 902, 3, 261, 129, 0, 902, 174, 1, 0, 0, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 241, 119, 0, 905, 906, 3, 249, 123, 0, 906, 907, 3, 233, 115, 0, 907, 908, 3, 261, 129, 0, 908, 909, 3, 263, 130, 0, 909, 910, 3, 225, 111, 0, 910, 911, 3, 249, 123, 0, 911, 912, 3, 255, 126, 0, 912, 176, 1, 0, 0, 0, 913, 914, 3, 263, 130, 0, 914, 915, 3, 253, 125, 0, 915, 178, 1, 0, 0, 0, 916, 917, 3, 263, 130, 0, 917, 918, 3, 253, 125, 0, 918, 919, 3, 255, 126, 0, 919, 180, 1, 0, 0, 0, 920, 921, 3, 263, 130, 0, 921, 922, 3, 253, 125, 0, 922, 923, 3, 263, 130, 0, 923, 924, 3, 225, 111, 0, 924, 925, 3, 247, 122, 0, 925, 926, 3, 261, 129, 0, 926, 182, 1, 0, 0, 0, 927, 928, 3, 263, 130, 0, 928, 929, 3, 259, 128, 0, 929, 930, 3, 225, 111, 0, 930, 931, 3, 241, 119, 0, 931, 932, 3, 247, 122, 0, 932, 933, 3, 241, 119, 0, 933, 934, 3, 251, 124, 0, 934, 935, 3, 237, 117, 0, 935, 184, 1, 0, 0, 0, 936, 937, 3, 263, 130, 0, 937, 938, 3, 259, 128, 0, 938, 939, 3, 241, 119, 0, 939, 940, 3, 249, 123, 0, 940, 186, 1, 0, 0, 0, 941, 942, 3, 263, 130, 0, 942, 943, 3, 259, 128, 0, 943, 944, 3, 265, 131, 0, 944, 945, 3, 251, 124, 0, 945, 946, 3, 229, 113, 0, 946, 947, 3, 225, 111, 0, 947, 948, 3, 263, 130, 0, 948, 949, 3, 233, 115, 0, 949, 188, 1, 0, 0, 0, 950, 951, 3, 263, 130, 0, 951, 952, 3, 259, 128, 0, 952, 953, 3, 273, 135, 0, 953, 190, 1, 0, 0, 0, 954, 955, 3, 265, 131, 0, 955, 956, 3, 251, 124, 0, 956, 957, 3, 227, 112, 0, 957, 958, 3, 253, 125, 0, 958, 959, 3, 265, 131, 0, 959, 960, 3, 251, 124, 0, 960, 961, 3, 231, 114, 0, 961, 962, 3, 233, 115, 0, 962, 963, 3, 231, 114, 0, 963, 192, 1, 0, 0, 0, 964, 965, 3, 265, 131, 0, 965, 966, 3, 251, 124, 0, 966, 967, 3, 241, 119, 0, 967, 968, 3, 253, 125, 0, 968, 969, 3, 251, 124, 0, 969, 194, 1, 0, 0, 0, 970, 971, 3, 265, 131, 0, 971, 972, 3, 261, 129, 0, 972, 973, 3, 241, 119, 0, 973, 974, 3, 251, 124, 0, 974, 975, 3, 237, 117, 0, 975, 196, 1, 0, 0, 0, 976, 977, 3, 269, 133, 0, 977, 978, 3, 233, 115, 0, 978, 979, 3, 233, 115, 0, 979, 980, 3, 245, 121, 0, 980, 198, 1, 0, 0, 0, 981, 982, 3, 269, 133, 0, 982, 983, 3, 239, 118, 0, 983, 984, 3, 233, 115, 0, 984, 985, 3, 251, 124, 0, 985, 200, 1, 0, 0, 0, 986, 987, 3, 269, 133, 0, 987, 988, 3, 239, 118, 0, 988, 989, 3, 233, 115, 0, 989, 990, 3, 259, 128, 0, 990, 991, 3, 233, 115, 0, 991, 202, 1, 0, 0, 0, 992, 993, 3, 269, 133, 0, 993, 994, 3, 239, 118, 0, 994, 995, 3, 241, 119, 0, 995, 996, 3, 247, 122, 0, 996, 997, 3, 233, 115, 0, 997, 204, 1, 0, 0, 0, 998, 999, 3, 269, 133, 0, 999, 1000, 3, 241, 119, 0, 1000, 1001, 3, 251, 124, 0, 1001, 1002, 3, 231, 114, 0, 1002, 1003, 3, 253, 125, 0, 1003, 1004, 3, 269, 133, 0, 1004, 206, 1, 0, 0, 0, 1005, 1006, 3, 269, 133, 0, 1006, 1007, 3, 241, 119, 0, 1007, 1008, 3, 263, 130, 0, 1008, 1009, 3, 239, 118, 0, 1009, 208, 1, 0, 0, 0, 1010, 1011, 3, 273, 135, 0, 1011, 1012, 3, 233, 115, 0, 1012, 1013, 3, 225, 111, 0, 1013, 1014, 3, 259, 128, 0, 1014, 1021, 1, 0, 0, 0, 1015, 1016, 3, 273, 135, 0, 1016, 1017, 3, 273, 135, 0, 1017, 1018, 3, 273, 135, 0, 1018, 1019, 3, 273, 135, 0, 1019, 1021, 1, 0, 0, 0, 1020, 1010, 1, 0, 0, 0, 1020, 1015, 1, 0, 0, 0, 1021, 210, 1, 0, 0, 0, 1022, 1023, 3, 291, 144, 0, 1023, 1024, 3, 227, 112, 0, 1024, 1050, 1, 0, 0, 0, 1025, 1026, 3, 291, 144, 0, 1026, 1027, 3, 235, 116, 0, 1027, 1050, 1, 0, 0, 0, 1028, 1029, 3, 291, 144, 0, 1029, 1030, 3, 259, 128, 0, 1030, 1050, 1, 0, 0, 0, 1031, 1032, 3, 291, 144, 0, 1032, 1033, 3, 251, 124, 0, 1033, 1050, 1, 0, 0, 0, 1034, 1035, 3, 291, 144, 0, 1035, 1036, 3, 263, 130, 0, 1036, 1050, 1, 0, 0, 0, 1037, 1038, 3, 291, 144, 0, 1038, 1039, 5, 48, 0, 0, 1039, 1050, 1, 0, 0, 0, 1040, 1041, 3, 291, 144, 0, 1041, 1042, 3, 225, 111, 0, 1042, 1050, 1, 0, 0, 0, 1043, 1044, 3, 291, 144, 0, 1044, 1045, 3, 267, 132, 0, 1045, 1050, 1, 0, 0, 0, 1046, 1047, 3, 291, 144, 0, 1047, 1048, 3, 291, 144, 0, 1048, 1050, 1, 0, 0, 0, 1049, 1022, 1, 0, 0, 0, 1049, 1025, 1, 0, 0, 0, 1049, 1028, 1, 0, 0, 0, 1049, 1031, 1, 0, 0, 0, 1049, 1034, 1, 0, 0, 0, 1049, 1037, 1, 0, 0, 0, 1049, 1040, 1, 0, 0, 0, 1049, 1043, 1, 0, 0, 0, 1049, 1046, 1, 0, 0, 0, 1050, 212, 1, 0, 0, 0, 1051, 1055, 3, 277, 137, 0, 1052, 1055, 3, 367, 182, 0, 1053, 1055, 3, 301, 149, 0, 1054, 1051, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1054, 1053, 1, 0, 0, 0, 1055, 1062, 1, 0, 0, 0, 1056, 1061, 3, 277, 137, 0, 1057, 1061, 3, 367, 182, 0, 1058, 1061, 3, 281, 139, 0, 1059, 1061, 3, 301, 149, 0, 1060, 1056, 1, 0, 0, 0, 1060, 1057, 1, 0, 0, 0, 1060, 1058, 1, 0, 0, 0, 1060, 1059, 1, 0, 0, 0, 1061, 1064, 1, 0, 0, 0, 1062, 1060, 1, 0, 0, 0, 1062, 1063, 1, 0, 0, 0, 1063, 1098, 1, 0, 0, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1076, 3, 289, 143, 0, 1066, 1075, 8, 0, 0, 0, 1067, 1075, 3, 211, 104, 0, 1068, 1069, 3, 291, 144, 0, 1069, 1070, 3, 351, 174, 0, 1070, 1075, 1, 0, 0, 0, 1071, 1072, 3, 289, 143, 0, 1072, 1073, 3, 289, 143, 0, 1073, 1075, 1, 0, 0, 0, 1074, 1066, 1, 0, 0, 0, 1074, 1067, 1, 0, 0, 0, 1074, 1068, 1, 0, 0, 0, 1074, 1071, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1076, 1077, 1, 0, 0, 0, 1077, 1079, 1, 0, 0, 0, 1078, 1076, 1, 0, 0, 0, 1079, 1080, 3, 289, 143, 0, 1080, 1098, 1, 0, 0, 0, 1081, 1092, 3, 345, 171, 0, 1082, 1091, 8, 1, 0, 0, 1083, 1091, 3, 211, 104, 0, 1084, 1085, 3, 291, 144, 0, 1085, 1086, 3, 345, 171, 0, 1086, 1091, 1, 0, 0, 0, 1087, 1088, 3, 345, 171, 0, 1088, 1089, 3, 345, 171, 0, 1089, 1091, 1, 0, 0, 0, 1090, 1082, 1, 0, 0, 0, 1090, 1083, 1, 0, 0, 0, 1090, 1084, 1, 0, 0, 0, 1090, 1087, 1, 0, 0, 0, 1091, 1094, 1, 0, 0, 0, 1092, 1090, 1, 0, 0, 0, 1092, 1093, 1, 0, 0, 0, 1093, 1095, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1095, 1096, 3, 345, 171, 0, 1096, 1098, 1, 0, 0, 0, 1097, 1054, 1, 0, 0, 0, 1097, 1065, 1, 0, 0, 0, 1097, 1081, 1, 0, 0, 0, 1098, 214, 1, 0, 0, 0, 1099, 1100, 3, 221, 109, 0, 1100, 1104, 3, 303, 150, 0, 1101, 1103, 3, 283, 140, 0, 1102, 1101, 1, 0, 0, 0, 1103, 1106, 1, 0, 0, 0, 1104, 1102, 1, 0, 0, 0, 1104, 1105, 1, 0, 0, 0, 1105, 1109, 1, 0, 0, 0, 1106, 1104, 1, 0, 0, 0, 1107, 1110, 3, 255, 126, 0, 1108, 1110, 3, 233, 115, 0, 1109, 1107, 1, 0, 0, 0, 1109, 1108, 1, 0, 0, 0, 1110, 1113, 1, 0, 0, 0, 1111, 1114, 3, 341, 169, 0, 1112, 1114, 3, 299, 148, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1112, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1117, 3, 281, 139, 0, 1116, 1115, 1, 0, 0, 0, 1117, 1118, 1, 0, 0, 0, 1118, 1116, 1, 0, 0, 0, 1118, 1119, 1, 0, 0, 0, 1119, 1176, 1, 0, 0, 0, 1120, 1123, 3, 221, 109, 0, 1121, 1124, 3, 255, 126, 0, 1122, 1124, 3, 233, 115, 0, 1123, 1121, 1, 0, 0, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1128, 3, 341, 169, 0, 1126, 1128, 3, 299, 148, 0, 1127, 1125, 1, 0, 0, 0, 1127, 1126, 1, 0, 0, 0, 1127, 1128, 1, 0, 0, 0, 1128, 1130, 1, 0, 0, 0, 1129, 1131, 3, 281, 139, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1132, 1, 0, 0, 0, 1132, 1130, 1, 0, 0, 0, 1132, 1133, 1, 0, 0, 0, 1133, 1176, 1, 0, 0, 0, 1134, 1135, 3, 219, 108, 0, 1135, 1139, 3, 303, 150, 0, 1136, 1138, 3, 281, 139, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1141, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1142, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1142, 1145, 3, 233, 115, 0, 1143, 1146, 3, 341, 169, 0, 1144, 1146, 3, 299, 148, 0, 1145, 1143, 1, 0, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 1148, 1, 0, 0, 0, 1147, 1149, 3, 281, 139, 0, 1148, 1147, 1, 0, 0, 0, 1149, 1150, 1, 0, 0, 0, 1150, 1148, 1, 0, 0, 0, 1150, 1151, 1, 0, 0, 0, 1151, 1176, 1, 0, 0, 0, 1152, 1153, 3, 303, 150, 0, 1153, 1154, 3, 219, 108, 0, 1154, 1157, 3, 233, 115, 0, 1155, 1158, 3, 341, 169, 0, 1156, 1158, 3, 299, 148, 0, 1157, 1155, 1, 0, 0, 0, 1157, 1156, 1, 0, 0, 0, 1157, 1158, 1, 0, 0, 0, 1158, 1160, 1, 0, 0, 0, 1159, 1161, 3, 281, 139, 0, 1160, 1159, 1, 0, 0, 0, 1161, 1162, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1162, 1163, 1, 0, 0, 0, 1163, 1176, 1, 0, 0, 0, 1164, 1165, 3, 219, 108, 0, 1165, 1168, 3, 233, 115, 0, 1166, 1169, 3, 341, 169, 0, 1167, 1169, 3, 299, 148, 0, 1168, 1166, 1, 0, 0, 0, 1168, 1167, 1, 0, 0, 0, 1168, 1169, 1, 0, 0, 0, 1169, 1171, 1, 0, 0, 0, 1170, 1172, 3, 281, 139, 0, 1171, 1170, 1, 0, 0, 0, 1172, 1173, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 1176, 1, 0, 0, 0, 1175, 1099, 1, 0, 0, 0, 1175, 1120, 1, 0, 0, 0, 1175, 1134, 1, 0, 0, 0, 1175, 1152, 1, 0, 0, 0, 1175, 1164, 1, 0, 0, 0, 1176, 216, 1, 0, 0, 0, 1177, 1179, 5, 48, 0, 0, 1178, 1180, 3, 279, 138, 0, 1179, 1178, 1, 0, 0, 0, 1180, 1181, 1, 0, 0, 0, 1181, 1179, 1, 0, 0, 0, 1181, 1182, 1, 0, 0, 0, 1182, 218, 1, 0, 0, 0, 1183, 1185, 3, 281, 139, 0, 1184, 1183, 1, 0, 0, 0, 1185, 1186, 1, 0, 0, 0, 1186, 1184, 1, 0, 0, 0, 1186, 1187, 1, 0, 0, 0, 1187, 220, 1, 0, 0, 0, 1188, 1189, 5, 48, 0, 0, 1189, 1191, 3, 271, 134, 0, 1190, 1192, 3, 283, 140, 0, 1191, 1190, 1, 0, 0, 0, 1192, 1193, 1, 0, 0, 0, 1193, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 222, 1, 0, 0, 0, 1195, 1206, 3, 351, 174, 0, 1196, 1205, 8, 2, 0, 0, 1197, 1205, 3, 211, 104, 0, 1198, 1199, 3, 291, 144, 0, 1199, 1200, 3, 351, 174, 0, 1200, 1205, 1, 0, 0, 0, 1201, 1202, 3, 351, 174, 0, 1202, 1203, 3, 351, 174, 0, 1203, 1205, 1, 0, 0, 0, 1204, 1196, 1, 0, 0, 0, 1204, 1197, 1, 0, 0, 0, 1204, 1198, 1, 0, 0, 0, 1204, 1201, 1, 0, 0, 0, 1205, 1208, 1, 0, 0, 0, 1206, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1206, 1, 0, 0, 0, 1209, 1210, 3, 351, 174, 0, 1210, 224, 1, 0, 0, 0, 1211, 1212, 7, 3, 0, 0, 1212, 226, 1, 0, 0, 0, 1213, 1214, 7, 4, 0, 0, 1214, 228, 1, 0, 0, 0, 1215, 1216, 7, 5, 0, 0, 1216, 230, 1, 0, 0, 0, 1217, 1218, 7, 6, 0, 0, 1218, 232, 1, 0, 0, 0, 1219, 1220, 7, 7, 0, 0, 1220, 234, 1, 0, 0, 0, 1221, 1222, 7, 8, 0, 0, 1222, 236, 1, 0, 0, 0, 1223, 1224, 7, 9, 0, 0, 1224, 238, 1, 0, 0, 0, 1225, 1226, 7, 10, 0, 0, 1226, 240, 1, 0, 0, 0, 1227, 1228, 7, 11, 0, 0, 1228, 242, 1, 0, 0, 0, 1229, 1230, 7, 12, 0, 0, 1230, 244, 1, 0, 0, 0, 1231, 1232, 7, 13, 0, 0, 1232, 246, 1, 0, 0, 0, 1233, 1234, 7, 14, 0, 0, 1234, 248, 1, 0, 0, 0, 1235, 1236, 7, 15, 0, 0, 1236, 250, 1, 0, 0, 0, 1237, 1238, 7, 16, 0, 0, 1238, 252, 1, 0, 0, 0, 1239, 1240, 7, 17, 0, 0, 1240, 254, 1, 0, 0, 0, 1241, 1242, 7, 18, 0, 0, 1242, 256, 1, 0, 0, 0, 1243, 1244, 7, 19, 0, 0, 1244, 258, 1, 0, 0, 0, 1245, 1246, 7, 20, 0, 0, 1246, 260, 1, 0, 0, 0, 1247, 1248, 7, 21, 0, 0, 1248, 262, 1, 0, 0, 0, 1249, 1250, 7, 22, 0, 0, 1250, 264, 1, 0, 0, 0, 1251, 1252, 7, 23, 0, 0, 1252, 266, 1, 0, 0, 0, 1253, 1254, 7, 24, 0, 0, 1254, 268, 1, 0, 0, 0, 1255, 1256, 7, 25, 0, 0, 1256, 270, 1, 0, 0, 0, 1257, 1258, 7, 26, 0, 0, 1258, 272, 1, 0, 0, 0, 1259, 1260, 7, 27, 0, 0, 1260, 274, 1, 0, 0, 0, 1261, 1262, 7, 28, 0, 0, 1262, 276, 1, 0, 0, 0, 1263, 1264, 7, 29, 0, 0, 1264, 278, 1, 0, 0, 0, 1265, 1266, 7, 30, 0, 0, 1266, 280, 1, 0, 0, 0, 1267, 1268, 7, 31, 0, 0, 1268, 282, 1, 0, 0, 0, 1269, 1270, 7, 32, 0, 0, 1270, 284, 1, 0, 0, 0, 1271, 1272, 5, 45, 0, 0, 1272, 1273, 5, 62, 0, 0, 1273, 286, 1, 0, 0, 0, 1274, 1275, 5, 42, 0, 0, 1275, 288, 1, 0, 0, 0, 1276, 1277, 5, 96, 0, 0, 1277, 290, 1, 0, 0, 0, 1278, 1279, 5, 92, 0, 0, 1279, 292, 1, 0, 0, 0, 1280, 1281, 5, 58, 0, 0, 1281, 294, 1, 0, 0, 0, 1282, 1283, 5, 44, 0, 0, 1283, 296, 1, 0, 0, 0, 1284, 1285, 5, 124, 0, 0, 1285, 1286, 5, 124, 0, 0, 1286, 298, 1, 0, 0, 0, 1287, 1288, 5, 45, 0, 0, 1288, 300, 1, 0, 0, 0, 1289, 1290, 5, 36, 0, 0, 1290, 302, 1, 0, 0, 0, 1291, 1292, 5, 46, 0, 0, 1292, 304, 1, 0, 0, 0, 1293, 1294, 5, 61, 0, 0, 1294, 1295, 5, 61, 0, 0, 1295, 306, 1, 0, 0, 0, 1296, 1297, 5, 61, 0, 0, 1297, 308, 1, 0, 0, 0, 1298, 1299, 5, 62, 0, 0, 1299, 1300, 5, 61, 0, 0, 1300, 310, 1, 0, 0, 0, 1301, 1302, 5, 62, 0, 0, 1302, 312, 1, 0, 0, 0, 1303, 1304, 5, 35, 0, 0, 1304, 314, 1, 0, 0, 0, 1305, 1306, 5, 126, 0, 0, 1306, 1307, 5, 42, 0, 0, 1307, 316, 1, 0, 0, 0, 1308, 1309, 5, 61, 0, 0, 1309, 1310, 5, 126, 0, 0, 1310, 1311, 5, 42, 0, 0, 1311, 318, 1, 0, 0, 0, 1312, 1313, 5, 123, 0, 0, 1313, 1314, 1, 0, 0, 0, 1314, 1315, 6, 158, 0, 0, 1315, 320, 1, 0, 0, 0, 1316, 1317, 5, 91, 0, 0, 1317, 322, 1, 0, 0, 0, 1318, 1319, 5, 40, 0, 0, 1319, 324, 1, 0, 0, 0, 1320, 1321, 5, 60, 0, 0, 1321, 1322, 5, 61, 0, 0, 1322, 326, 1, 0, 0, 0, 1323, 1324, 5, 60, 0, 0, 1324, 328, 1, 0, 0, 0, 1325, 1326, 5, 33, 0, 0, 1326, 1330, 5, 61, 0, 0, 1327, 1328, 5, 60, 0, 0, 1328, 1330, 5, 62, 0, 0, 1329, 1325, 1, 0, 0, 0, 1329, 1327, 1, 0, 0, 0, 1330, 330, 1, 0, 0, 0, 1331, 1332, 5, 33, 0, 0, 1332, 1333, 5, 126, 0, 0, 1333, 1334, 5, 42, 0, 0, 1334, 332, 1, 0, 0, 0, 1335, 1336, 5, 33, 0, 0, 1336, 1337, 5, 126, 0, 0, 1337, 334, 1, 0, 0, 0, 1338, 1339, 5, 63, 0, 0, 1339, 1340, 5, 46, 0, 0, 1340, 336, 1, 0, 0, 0, 1341, 1342, 5, 63, 0, 0, 1342, 1343, 5, 63, 0, 0, 1343, 338, 1, 0, 0, 0, 1344, 1345, 5, 37, 0, 0, 1345, 340, 1, 0, 0, 0, 1346, 1347, 5, 43, 0, 0, 1347, 342, 1, 0, 0, 0, 1348, 1349, 5, 63, 0, 0, 1349, 344, 1, 0, 0, 0, 1350, 1351, 5, 34, 0, 0, 1351, 346, 1, 0, 0, 0, 1352, 1353, 5, 102, 0, 0, 1353, 1354, 5, 39, 0, 0, 1354, 1355, 1, 0, 0, 0, 1355, 1356, 6, 172, 1, 0, 1356, 348, 1, 0, 0, 0, 1357, 1358, 5, 70, 0, 0, 1358, 1359, 5, 39, 0, 0, 1359, 1360, 1, 0, 0, 0, 1360, 1361, 6, 173, 2, 0, 1361, 350, 1, 0, 0, 0, 1362, 1363, 5, 39, 0, 0, 1363, 352, 1, 0, 0, 0, 1364, 1365, 5, 126, 0, 0, 1365, 354, 1, 0, 0, 0, 1366, 1367, 5, 61, 0, 0, 1367, 1368, 5, 126, 0, 0, 1368, 356, 1, 0, 0, 0, 1369, 1370, 5, 125, 0, 0, 1370, 1371, 1, 0, 0, 0, 1371, 1372, 6, 177, 3, 0, 1372, 358, 1, 0, 0, 0, 1373, 1374, 5, 93, 0, 0, 1374, 360, 1, 0, 0, 0, 1375, 1376, 5, 41, 0, 0, 1376, 362, 1, 0, 0, 0, 1377, 1378, 5, 59, 0, 0, 1378, 364, 1, 0, 0, 0, 1379, 1380, 5, 47, 0, 0, 1380, 366, 1, 0, 0, 0, 1381, 1382, 5, 95, 0, 0, 1382, 368, 1, 0, 0, 0, 1383, 1384, 5, 47, 0, 0, 1384, 1385, 5, 42, 0, 0, 1385, 1389, 1, 0, 0, 0, 1386, 1388, 9, 0, 0, 0, 1387, 1386, 1, 0, 0, 0, 1388, 1391, 1, 0, 0, 0, 1389, 1390, 1, 0, 0, 0, 1389, 1387, 1, 0, 0, 0, 1390, 1392, 1, 0, 0, 0, 1391, 1389, 1, 0, 0, 0, 1392, 1393, 5, 42, 0, 0, 1393, 1394, 5, 47, 0, 0, 1394, 1395, 1, 0, 0, 0, 1395, 1396, 6, 183, 4, 0, 1396, 370, 1, 0, 0, 0, 1397, 1398, 5, 45, 0, 0, 1398, 1402, 5, 45, 0, 0, 1399, 1400, 5, 47, 0, 0, 1400, 1402, 5, 47, 0, 0, 1401, 1397, 1, 0, 0, 0, 1401, 1399, 1, 0, 0, 0, 1402, 1406, 1, 0, 0, 0, 1403, 1405, 8, 33, 0, 0, 1404, 1403, 1, 0, 0, 0, 1405, 1408, 1, 0, 0, 0, 1406, 1404, 1, 0, 0, 0, 1406, 1407, 1, 0, 0, 0, 1407, 1410, 1, 0, 0, 0, 1408, 1406, 1, 0, 0, 0, 1409, 1411, 7, 34, 0, 0, 1410, 1409, 1, 0, 0, 0, 1411, 1412, 1, 0, 0, 0, 1412, 1413, 6, 184, 4, 0, 1413, 372, 1, 0, 0, 0, 1414, 1415, 7, 35, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 5, 0, 1417, 374, 1, 0, 0, 0, 1418, 1430, 8, 36, 0, 0, 1419, 1430, 3, 211, 104, 0, 1420, 1421, 3, 291, 144, 0, 1421, 1422, 3, 351, 174, 0, 1422, 1430, 1, 0, 0, 0, 1423, 1424, 3, 291, 144, 0, 1424, 1425, 3, 319, 158, 0, 1425, 1430, 1, 0, 0, 0, 1426, 1427, 3, 351, 174, 0, 1427, 1428, 3, 351, 174, 0, 1428, 1430, 1, 0, 0, 0, 1429, 1418, 1, 0, 0, 0, 1429, 1419, 1, 0, 0, 0, 1429, 1420, 1, 0, 0, 0, 1429, 1423, 1, 0, 0, 0, 1429, 1426, 1, 0, 0, 0, 1430, 1431, 1, 0, 0, 0, 1431, 1429, 1, 0, 0, 0, 1431, 1432, 1, 0, 0, 0, 1432, 376, 1, 0, 0, 0, 1433, 1434, 3, 319, 158, 0, 1434, 1435, 1, 0, 0, 0, 1435, 1436, 6, 187, 0, 0, 1436, 378, 1, 0, 0, 0, 1437, 1438, 3, 351, 174, 0, 1438, 1439, 1, 0, 0, 0, 1439, 1440, 6, 188, 6, 0, 1440, 1441, 6, 188, 3, 0, 1441, 380, 1, 0, 0, 0, 1442, 1448, 8, 37, 0, 0, 1443, 1448, 3, 211, 104, 0, 1444, 1445, 3, 291, 144, 0, 1445, 1446, 3, 319, 158, 0, 1446, 1448, 1, 0, 0, 0, 1447, 1442, 1, 0, 0, 0, 1447, 1443, 1, 0, 0, 0, 1447, 1444, 1, 0, 0, 0, 1448, 1449, 1, 0, 0, 0, 1449, 1447, 1, 0, 0, 0, 1449, 1450, 1, 0, 0, 0, 1450, 382, 1, 0, 0, 0, 1451, 1452, 3, 319, 158, 0, 1452, 1453, 1, 0, 0, 0, 1453, 1454, 6, 190, 0, 0, 1454, 384, 1, 0, 0, 0, 44, 0, 1, 2, 425, 646, 1020, 1049, 1054, 1060, 1062, 1074, 1076, 1090, 1092, 1097, 1104, 1109, 1113, 1118, 1123, 1127, 1132, 1139, 1145, 1150, 1157, 1162, 1168, 1173, 1175, 1181, 1186, 1193, 1204, 1206, 1329, 1389, 1401, 1406, 1410, 1429, 1431, 1447, 1449, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 145, 0] \ No newline at end of file +[4, 0, 162, 1476, 6, -1, 6, -1, 6, -1, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 2, 87, 7, 87, 2, 88, 7, 88, 2, 89, 7, 89, 2, 90, 7, 90, 2, 91, 7, 91, 2, 92, 7, 92, 2, 93, 7, 93, 2, 94, 7, 94, 2, 95, 7, 95, 2, 96, 7, 96, 2, 97, 7, 97, 2, 98, 7, 98, 2, 99, 7, 99, 2, 100, 7, 100, 2, 101, 7, 101, 2, 102, 7, 102, 2, 103, 7, 103, 2, 104, 7, 104, 2, 105, 7, 105, 2, 106, 7, 106, 2, 107, 7, 107, 2, 108, 7, 108, 2, 109, 7, 109, 2, 110, 7, 110, 2, 111, 7, 111, 2, 112, 7, 112, 2, 113, 7, 113, 2, 114, 7, 114, 2, 115, 7, 115, 2, 116, 7, 116, 2, 117, 7, 117, 2, 118, 7, 118, 2, 119, 7, 119, 2, 120, 7, 120, 2, 121, 7, 121, 2, 122, 7, 122, 2, 123, 7, 123, 2, 124, 7, 124, 2, 125, 7, 125, 2, 126, 7, 126, 2, 127, 7, 127, 2, 128, 7, 128, 2, 129, 7, 129, 2, 130, 7, 130, 2, 131, 7, 131, 2, 132, 7, 132, 2, 133, 7, 133, 2, 134, 7, 134, 2, 135, 7, 135, 2, 136, 7, 136, 2, 137, 7, 137, 2, 138, 7, 138, 2, 139, 7, 139, 2, 140, 7, 140, 2, 141, 7, 141, 2, 142, 7, 142, 2, 143, 7, 143, 2, 144, 7, 144, 2, 145, 7, 145, 2, 146, 7, 146, 2, 147, 7, 147, 2, 148, 7, 148, 2, 149, 7, 149, 2, 150, 7, 150, 2, 151, 7, 151, 2, 152, 7, 152, 2, 153, 7, 153, 2, 154, 7, 154, 2, 155, 7, 155, 2, 156, 7, 156, 2, 157, 7, 157, 2, 158, 7, 158, 2, 159, 7, 159, 2, 160, 7, 160, 2, 161, 7, 161, 2, 162, 7, 162, 2, 163, 7, 163, 2, 164, 7, 164, 2, 165, 7, 165, 2, 166, 7, 166, 2, 167, 7, 167, 2, 168, 7, 168, 2, 169, 7, 169, 2, 170, 7, 170, 2, 171, 7, 171, 2, 172, 7, 172, 2, 173, 7, 173, 2, 174, 7, 174, 2, 175, 7, 175, 2, 176, 7, 176, 2, 177, 7, 177, 2, 178, 7, 178, 2, 179, 7, 179, 2, 180, 7, 180, 2, 181, 7, 181, 2, 182, 7, 182, 2, 183, 7, 183, 2, 184, 7, 184, 2, 185, 7, 185, 2, 186, 7, 186, 2, 187, 7, 187, 2, 188, 7, 188, 2, 189, 7, 189, 2, 190, 7, 190, 2, 191, 7, 191, 2, 192, 7, 192, 1, 0, 1, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 4, 1, 5, 1, 5, 1, 5, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, 6, 430, 8, 6, 1, 7, 1, 7, 1, 7, 1, 7, 1, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 1, 9, 1, 9, 1, 10, 1, 10, 1, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 16, 1, 17, 1, 17, 1, 17, 1, 17, 1, 17, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 1, 20, 1, 21, 1, 21, 1, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 24, 1, 24, 1, 24, 1, 24, 1, 24, 1, 25, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 27, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 1, 41, 1, 41, 1, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 43, 1, 43, 1, 43, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 658, 8, 44, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 45, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 46, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 47, 1, 48, 1, 48, 1, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 59, 1, 59, 1, 59, 1, 59, 1, 60, 1, 60, 1, 60, 1, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 64, 1, 64, 1, 64, 1, 65, 1, 65, 1, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 74, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 75, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 76, 1, 77, 1, 77, 1, 77, 1, 77, 1, 78, 1, 78, 1, 78, 1, 78, 1, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 1, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 1, 87, 1, 87, 1, 87, 1, 87, 1, 87, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 88, 1, 89, 1, 89, 1, 89, 1, 90, 1, 90, 1, 90, 1, 90, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 91, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 92, 1, 93, 1, 93, 1, 93, 1, 93, 1, 93, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 94, 1, 95, 1, 95, 1, 95, 1, 95, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 96, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 97, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 98, 1, 99, 1, 99, 1, 99, 1, 99, 1, 99, 1, 100, 1, 100, 1, 100, 1, 100, 1, 100, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 101, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 102, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 103, 1, 104, 1, 104, 1, 104, 1, 104, 1, 104, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 1, 105, 3, 105, 1042, 8, 105, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 1, 106, 3, 106, 1071, 8, 106, 1, 107, 1, 107, 1, 107, 3, 107, 1076, 8, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1082, 8, 107, 10, 107, 12, 107, 1085, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1096, 8, 107, 10, 107, 12, 107, 1099, 9, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 1, 107, 5, 107, 1112, 8, 107, 10, 107, 12, 107, 1115, 9, 107, 1, 107, 1, 107, 3, 107, 1119, 8, 107, 1, 108, 1, 108, 1, 108, 5, 108, 1124, 8, 108, 10, 108, 12, 108, 1127, 9, 108, 1, 108, 1, 108, 3, 108, 1131, 8, 108, 1, 108, 1, 108, 3, 108, 1135, 8, 108, 1, 108, 4, 108, 1138, 8, 108, 11, 108, 12, 108, 1139, 1, 108, 1, 108, 1, 108, 3, 108, 1145, 8, 108, 1, 108, 1, 108, 3, 108, 1149, 8, 108, 1, 108, 4, 108, 1152, 8, 108, 11, 108, 12, 108, 1153, 1, 108, 1, 108, 1, 108, 5, 108, 1159, 8, 108, 10, 108, 12, 108, 1162, 9, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1167, 8, 108, 1, 108, 4, 108, 1170, 8, 108, 11, 108, 12, 108, 1171, 1, 108, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1179, 8, 108, 1, 108, 4, 108, 1182, 8, 108, 11, 108, 12, 108, 1183, 1, 108, 1, 108, 1, 108, 1, 108, 3, 108, 1190, 8, 108, 1, 108, 4, 108, 1193, 8, 108, 11, 108, 12, 108, 1194, 3, 108, 1197, 8, 108, 1, 109, 1, 109, 4, 109, 1201, 8, 109, 11, 109, 12, 109, 1202, 1, 110, 4, 110, 1206, 8, 110, 11, 110, 12, 110, 1207, 1, 111, 1, 111, 1, 111, 4, 111, 1213, 8, 111, 11, 111, 12, 111, 1214, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 1, 112, 5, 112, 1226, 8, 112, 10, 112, 12, 112, 1229, 9, 112, 1, 112, 1, 112, 1, 113, 1, 113, 1, 114, 1, 114, 1, 115, 1, 115, 1, 116, 1, 116, 1, 117, 1, 117, 1, 118, 1, 118, 1, 119, 1, 119, 1, 120, 1, 120, 1, 121, 1, 121, 1, 122, 1, 122, 1, 123, 1, 123, 1, 124, 1, 124, 1, 125, 1, 125, 1, 126, 1, 126, 1, 127, 1, 127, 1, 128, 1, 128, 1, 129, 1, 129, 1, 130, 1, 130, 1, 131, 1, 131, 1, 132, 1, 132, 1, 133, 1, 133, 1, 134, 1, 134, 1, 135, 1, 135, 1, 136, 1, 136, 1, 137, 1, 137, 1, 138, 1, 138, 1, 139, 1, 139, 1, 140, 1, 140, 1, 141, 1, 141, 1, 142, 1, 142, 1, 143, 1, 143, 1, 143, 1, 144, 1, 144, 1, 145, 1, 145, 1, 146, 1, 146, 1, 147, 1, 147, 1, 148, 1, 148, 1, 149, 1, 149, 1, 149, 1, 150, 1, 150, 1, 151, 1, 151, 1, 152, 1, 152, 1, 153, 1, 153, 1, 153, 1, 154, 1, 154, 1, 155, 1, 155, 1, 155, 1, 156, 1, 156, 1, 157, 1, 157, 1, 158, 1, 158, 1, 158, 1, 159, 1, 159, 1, 159, 1, 159, 1, 160, 1, 160, 1, 160, 1, 160, 1, 161, 1, 161, 1, 162, 1, 162, 1, 163, 1, 163, 1, 163, 1, 164, 1, 164, 1, 165, 1, 165, 1, 165, 1, 165, 3, 165, 1351, 8, 165, 1, 166, 1, 166, 1, 166, 1, 166, 1, 167, 1, 167, 1, 167, 1, 168, 1, 168, 1, 168, 1, 169, 1, 169, 1, 169, 1, 170, 1, 170, 1, 171, 1, 171, 1, 172, 1, 172, 1, 173, 1, 173, 1, 174, 1, 174, 1, 174, 1, 174, 1, 174, 1, 175, 1, 175, 1, 175, 1, 175, 1, 175, 1, 176, 1, 176, 1, 177, 1, 177, 1, 178, 1, 178, 1, 178, 1, 179, 1, 179, 1, 179, 1, 179, 1, 180, 1, 180, 1, 181, 1, 181, 1, 182, 1, 182, 1, 183, 1, 183, 1, 184, 1, 184, 1, 185, 1, 185, 1, 185, 1, 185, 5, 185, 1409, 8, 185, 10, 185, 12, 185, 1412, 9, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 185, 1, 186, 1, 186, 1, 186, 1, 186, 3, 186, 1423, 8, 186, 1, 186, 5, 186, 1426, 8, 186, 10, 186, 12, 186, 1429, 9, 186, 1, 186, 3, 186, 1432, 8, 186, 1, 186, 1, 186, 1, 187, 1, 187, 1, 187, 1, 187, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 1, 188, 4, 188, 1451, 8, 188, 11, 188, 12, 188, 1452, 1, 189, 1, 189, 1, 189, 1, 189, 1, 190, 1, 190, 1, 190, 1, 190, 1, 190, 1, 191, 1, 191, 1, 191, 1, 191, 1, 191, 4, 191, 1469, 8, 191, 11, 191, 12, 191, 1470, 1, 192, 1, 192, 1, 192, 1, 192, 1, 1410, 0, 193, 3, 1, 5, 2, 7, 3, 9, 4, 11, 5, 13, 6, 15, 7, 17, 8, 19, 9, 21, 10, 23, 11, 25, 12, 27, 13, 29, 14, 31, 15, 33, 16, 35, 17, 37, 18, 39, 19, 41, 20, 43, 21, 45, 22, 47, 23, 49, 24, 51, 25, 53, 26, 55, 27, 57, 28, 59, 29, 61, 30, 63, 31, 65, 32, 67, 33, 69, 34, 71, 35, 73, 36, 75, 37, 77, 38, 79, 39, 81, 40, 83, 41, 85, 42, 87, 43, 89, 44, 91, 45, 93, 46, 95, 47, 97, 48, 99, 49, 101, 50, 103, 51, 105, 52, 107, 53, 109, 54, 111, 55, 113, 56, 115, 57, 117, 58, 119, 59, 121, 60, 123, 61, 125, 62, 127, 63, 129, 64, 131, 65, 133, 66, 135, 67, 137, 68, 139, 69, 141, 70, 143, 71, 145, 72, 147, 73, 149, 74, 151, 75, 153, 76, 155, 77, 157, 78, 159, 79, 161, 80, 163, 81, 165, 82, 167, 83, 169, 84, 171, 85, 173, 86, 175, 87, 177, 88, 179, 89, 181, 90, 183, 91, 185, 92, 187, 93, 189, 94, 191, 95, 193, 96, 195, 97, 197, 98, 199, 99, 201, 100, 203, 101, 205, 102, 207, 103, 209, 104, 211, 105, 213, 106, 215, 107, 217, 108, 219, 109, 221, 110, 223, 111, 225, 112, 227, 113, 229, 0, 231, 0, 233, 0, 235, 0, 237, 0, 239, 0, 241, 0, 243, 0, 245, 0, 247, 0, 249, 0, 251, 0, 253, 0, 255, 0, 257, 0, 259, 0, 261, 0, 263, 0, 265, 0, 267, 0, 269, 0, 271, 0, 273, 0, 275, 0, 277, 0, 279, 0, 281, 0, 283, 0, 285, 0, 287, 0, 289, 114, 291, 115, 293, 116, 295, 117, 297, 118, 299, 119, 301, 120, 303, 121, 305, 122, 307, 123, 309, 124, 311, 125, 313, 126, 315, 127, 317, 128, 319, 129, 321, 130, 323, 131, 325, 132, 327, 133, 329, 134, 331, 135, 333, 136, 335, 137, 337, 138, 339, 139, 341, 140, 343, 141, 345, 142, 347, 143, 349, 144, 351, 145, 353, 146, 355, 147, 357, 148, 359, 149, 361, 150, 363, 151, 365, 152, 367, 153, 369, 154, 371, 155, 373, 156, 375, 157, 377, 158, 379, 159, 381, 160, 383, 0, 385, 161, 387, 162, 3, 0, 1, 2, 38, 2, 0, 92, 92, 96, 96, 2, 0, 34, 34, 92, 92, 2, 0, 39, 39, 92, 92, 2, 0, 65, 65, 97, 97, 2, 0, 66, 66, 98, 98, 2, 0, 67, 67, 99, 99, 2, 0, 68, 68, 100, 100, 2, 0, 69, 69, 101, 101, 2, 0, 70, 70, 102, 102, 2, 0, 71, 71, 103, 103, 2, 0, 72, 72, 104, 104, 2, 0, 73, 73, 105, 105, 2, 0, 74, 74, 106, 106, 2, 0, 75, 75, 107, 107, 2, 0, 76, 76, 108, 108, 2, 0, 77, 77, 109, 109, 2, 0, 78, 78, 110, 110, 2, 0, 79, 79, 111, 111, 2, 0, 80, 80, 112, 112, 2, 0, 81, 81, 113, 113, 2, 0, 82, 82, 114, 114, 2, 0, 83, 83, 115, 115, 2, 0, 84, 84, 116, 116, 2, 0, 85, 85, 117, 117, 2, 0, 86, 86, 118, 118, 2, 0, 87, 87, 119, 119, 2, 0, 88, 88, 120, 120, 2, 0, 89, 89, 121, 121, 2, 0, 90, 90, 122, 122, 2, 0, 65, 90, 97, 122, 1, 0, 48, 55, 1, 0, 48, 57, 3, 0, 48, 57, 65, 70, 97, 102, 2, 0, 10, 10, 13, 13, 2, 1, 10, 10, 13, 13, 2, 0, 9, 13, 32, 32, 3, 0, 39, 39, 92, 92, 123, 123, 1, 0, 123, 123, 1512, 0, 3, 1, 0, 0, 0, 0, 5, 1, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, 9, 1, 0, 0, 0, 0, 11, 1, 0, 0, 0, 0, 13, 1, 0, 0, 0, 0, 15, 1, 0, 0, 0, 0, 17, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 21, 1, 0, 0, 0, 0, 23, 1, 0, 0, 0, 0, 25, 1, 0, 0, 0, 0, 27, 1, 0, 0, 0, 0, 29, 1, 0, 0, 0, 0, 31, 1, 0, 0, 0, 0, 33, 1, 0, 0, 0, 0, 35, 1, 0, 0, 0, 0, 37, 1, 0, 0, 0, 0, 39, 1, 0, 0, 0, 0, 41, 1, 0, 0, 0, 0, 43, 1, 0, 0, 0, 0, 45, 1, 0, 0, 0, 0, 47, 1, 0, 0, 0, 0, 49, 1, 0, 0, 0, 0, 51, 1, 0, 0, 0, 0, 53, 1, 0, 0, 0, 0, 55, 1, 0, 0, 0, 0, 57, 1, 0, 0, 0, 0, 59, 1, 0, 0, 0, 0, 61, 1, 0, 0, 0, 0, 63, 1, 0, 0, 0, 0, 65, 1, 0, 0, 0, 0, 67, 1, 0, 0, 0, 0, 69, 1, 0, 0, 0, 0, 71, 1, 0, 0, 0, 0, 73, 1, 0, 0, 0, 0, 75, 1, 0, 0, 0, 0, 77, 1, 0, 0, 0, 0, 79, 1, 0, 0, 0, 0, 81, 1, 0, 0, 0, 0, 83, 1, 0, 0, 0, 0, 85, 1, 0, 0, 0, 0, 87, 1, 0, 0, 0, 0, 89, 1, 0, 0, 0, 0, 91, 1, 0, 0, 0, 0, 93, 1, 0, 0, 0, 0, 95, 1, 0, 0, 0, 0, 97, 1, 0, 0, 0, 0, 99, 1, 0, 0, 0, 0, 101, 1, 0, 0, 0, 0, 103, 1, 0, 0, 0, 0, 105, 1, 0, 0, 0, 0, 107, 1, 0, 0, 0, 0, 109, 1, 0, 0, 0, 0, 111, 1, 0, 0, 0, 0, 113, 1, 0, 0, 0, 0, 115, 1, 0, 0, 0, 0, 117, 1, 0, 0, 0, 0, 119, 1, 0, 0, 0, 0, 121, 1, 0, 0, 0, 0, 123, 1, 0, 0, 0, 0, 125, 1, 0, 0, 0, 0, 127, 1, 0, 0, 0, 0, 129, 1, 0, 0, 0, 0, 131, 1, 0, 0, 0, 0, 133, 1, 0, 0, 0, 0, 135, 1, 0, 0, 0, 0, 137, 1, 0, 0, 0, 0, 139, 1, 0, 0, 0, 0, 141, 1, 0, 0, 0, 0, 143, 1, 0, 0, 0, 0, 145, 1, 0, 0, 0, 0, 147, 1, 0, 0, 0, 0, 149, 1, 0, 0, 0, 0, 151, 1, 0, 0, 0, 0, 153, 1, 0, 0, 0, 0, 155, 1, 0, 0, 0, 0, 157, 1, 0, 0, 0, 0, 159, 1, 0, 0, 0, 0, 161, 1, 0, 0, 0, 0, 163, 1, 0, 0, 0, 0, 165, 1, 0, 0, 0, 0, 167, 1, 0, 0, 0, 0, 169, 1, 0, 0, 0, 0, 171, 1, 0, 0, 0, 0, 173, 1, 0, 0, 0, 0, 175, 1, 0, 0, 0, 0, 177, 1, 0, 0, 0, 0, 179, 1, 0, 0, 0, 0, 181, 1, 0, 0, 0, 0, 183, 1, 0, 0, 0, 0, 185, 1, 0, 0, 0, 0, 187, 1, 0, 0, 0, 0, 189, 1, 0, 0, 0, 0, 191, 1, 0, 0, 0, 0, 193, 1, 0, 0, 0, 0, 195, 1, 0, 0, 0, 0, 197, 1, 0, 0, 0, 0, 199, 1, 0, 0, 0, 0, 201, 1, 0, 0, 0, 0, 203, 1, 0, 0, 0, 0, 205, 1, 0, 0, 0, 0, 207, 1, 0, 0, 0, 0, 209, 1, 0, 0, 0, 0, 211, 1, 0, 0, 0, 0, 213, 1, 0, 0, 0, 0, 215, 1, 0, 0, 0, 0, 217, 1, 0, 0, 0, 0, 219, 1, 0, 0, 0, 0, 221, 1, 0, 0, 0, 0, 223, 1, 0, 0, 0, 0, 225, 1, 0, 0, 0, 0, 227, 1, 0, 0, 0, 0, 289, 1, 0, 0, 0, 0, 291, 1, 0, 0, 0, 0, 293, 1, 0, 0, 0, 0, 295, 1, 0, 0, 0, 0, 297, 1, 0, 0, 0, 0, 299, 1, 0, 0, 0, 0, 301, 1, 0, 0, 0, 0, 303, 1, 0, 0, 0, 0, 305, 1, 0, 0, 0, 0, 307, 1, 0, 0, 0, 0, 309, 1, 0, 0, 0, 0, 311, 1, 0, 0, 0, 0, 313, 1, 0, 0, 0, 0, 315, 1, 0, 0, 0, 0, 317, 1, 0, 0, 0, 0, 319, 1, 0, 0, 0, 0, 321, 1, 0, 0, 0, 0, 323, 1, 0, 0, 0, 0, 325, 1, 0, 0, 0, 0, 327, 1, 0, 0, 0, 0, 329, 1, 0, 0, 0, 0, 331, 1, 0, 0, 0, 0, 333, 1, 0, 0, 0, 0, 335, 1, 0, 0, 0, 0, 337, 1, 0, 0, 0, 0, 339, 1, 0, 0, 0, 0, 341, 1, 0, 0, 0, 0, 343, 1, 0, 0, 0, 0, 345, 1, 0, 0, 0, 0, 347, 1, 0, 0, 0, 0, 349, 1, 0, 0, 0, 0, 351, 1, 0, 0, 0, 0, 353, 1, 0, 0, 0, 0, 355, 1, 0, 0, 0, 0, 357, 1, 0, 0, 0, 0, 359, 1, 0, 0, 0, 0, 361, 1, 0, 0, 0, 0, 363, 1, 0, 0, 0, 0, 365, 1, 0, 0, 0, 0, 367, 1, 0, 0, 0, 0, 369, 1, 0, 0, 0, 0, 371, 1, 0, 0, 0, 0, 373, 1, 0, 0, 0, 0, 375, 1, 0, 0, 0, 0, 377, 1, 0, 0, 0, 1, 379, 1, 0, 0, 0, 1, 381, 1, 0, 0, 0, 1, 383, 1, 0, 0, 0, 2, 385, 1, 0, 0, 0, 2, 387, 1, 0, 0, 0, 3, 389, 1, 0, 0, 0, 5, 393, 1, 0, 0, 0, 7, 397, 1, 0, 0, 0, 9, 402, 1, 0, 0, 0, 11, 406, 1, 0, 0, 0, 13, 412, 1, 0, 0, 0, 15, 429, 1, 0, 0, 0, 17, 431, 1, 0, 0, 0, 19, 436, 1, 0, 0, 0, 21, 444, 1, 0, 0, 0, 23, 449, 1, 0, 0, 0, 25, 452, 1, 0, 0, 0, 27, 457, 1, 0, 0, 0, 29, 462, 1, 0, 0, 0, 31, 468, 1, 0, 0, 0, 33, 475, 1, 0, 0, 0, 35, 483, 1, 0, 0, 0, 37, 489, 1, 0, 0, 0, 39, 494, 1, 0, 0, 0, 41, 502, 1, 0, 0, 0, 43, 507, 1, 0, 0, 0, 45, 511, 1, 0, 0, 0, 47, 516, 1, 0, 0, 0, 49, 527, 1, 0, 0, 0, 51, 536, 1, 0, 0, 0, 53, 541, 1, 0, 0, 0, 55, 545, 1, 0, 0, 0, 57, 552, 1, 0, 0, 0, 59, 560, 1, 0, 0, 0, 61, 566, 1, 0, 0, 0, 63, 574, 1, 0, 0, 0, 65, 580, 1, 0, 0, 0, 67, 583, 1, 0, 0, 0, 69, 593, 1, 0, 0, 0, 71, 597, 1, 0, 0, 0, 73, 602, 1, 0, 0, 0, 75, 607, 1, 0, 0, 0, 77, 611, 1, 0, 0, 0, 79, 617, 1, 0, 0, 0, 81, 624, 1, 0, 0, 0, 83, 629, 1, 0, 0, 0, 85, 632, 1, 0, 0, 0, 87, 635, 1, 0, 0, 0, 89, 641, 1, 0, 0, 0, 91, 657, 1, 0, 0, 0, 93, 659, 1, 0, 0, 0, 95, 665, 1, 0, 0, 0, 97, 675, 1, 0, 0, 0, 99, 684, 1, 0, 0, 0, 101, 687, 1, 0, 0, 0, 103, 692, 1, 0, 0, 0, 105, 696, 1, 0, 0, 0, 107, 701, 1, 0, 0, 0, 109, 709, 1, 0, 0, 0, 111, 714, 1, 0, 0, 0, 113, 718, 1, 0, 0, 0, 115, 723, 1, 0, 0, 0, 117, 729, 1, 0, 0, 0, 119, 736, 1, 0, 0, 0, 121, 742, 1, 0, 0, 0, 123, 746, 1, 0, 0, 0, 125, 750, 1, 0, 0, 0, 127, 755, 1, 0, 0, 0, 129, 761, 1, 0, 0, 0, 131, 768, 1, 0, 0, 0, 133, 771, 1, 0, 0, 0, 135, 774, 1, 0, 0, 0, 137, 780, 1, 0, 0, 0, 139, 786, 1, 0, 0, 0, 141, 791, 1, 0, 0, 0, 143, 801, 1, 0, 0, 0, 145, 811, 1, 0, 0, 0, 147, 820, 1, 0, 0, 0, 149, 828, 1, 0, 0, 0, 151, 834, 1, 0, 0, 0, 153, 841, 1, 0, 0, 0, 155, 847, 1, 0, 0, 0, 157, 854, 1, 0, 0, 0, 159, 858, 1, 0, 0, 0, 161, 863, 1, 0, 0, 0, 163, 870, 1, 0, 0, 0, 165, 877, 1, 0, 0, 0, 167, 884, 1, 0, 0, 0, 169, 889, 1, 0, 0, 0, 171, 898, 1, 0, 0, 0, 173, 908, 1, 0, 0, 0, 175, 913, 1, 0, 0, 0, 177, 919, 1, 0, 0, 0, 179, 924, 1, 0, 0, 0, 181, 934, 1, 0, 0, 0, 183, 937, 1, 0, 0, 0, 185, 941, 1, 0, 0, 0, 187, 948, 1, 0, 0, 0, 189, 957, 1, 0, 0, 0, 191, 962, 1, 0, 0, 0, 193, 971, 1, 0, 0, 0, 195, 975, 1, 0, 0, 0, 197, 985, 1, 0, 0, 0, 199, 991, 1, 0, 0, 0, 201, 997, 1, 0, 0, 0, 203, 1002, 1, 0, 0, 0, 205, 1007, 1, 0, 0, 0, 207, 1013, 1, 0, 0, 0, 209, 1019, 1, 0, 0, 0, 211, 1026, 1, 0, 0, 0, 213, 1041, 1, 0, 0, 0, 215, 1070, 1, 0, 0, 0, 217, 1118, 1, 0, 0, 0, 219, 1196, 1, 0, 0, 0, 221, 1198, 1, 0, 0, 0, 223, 1205, 1, 0, 0, 0, 225, 1209, 1, 0, 0, 0, 227, 1216, 1, 0, 0, 0, 229, 1232, 1, 0, 0, 0, 231, 1234, 1, 0, 0, 0, 233, 1236, 1, 0, 0, 0, 235, 1238, 1, 0, 0, 0, 237, 1240, 1, 0, 0, 0, 239, 1242, 1, 0, 0, 0, 241, 1244, 1, 0, 0, 0, 243, 1246, 1, 0, 0, 0, 245, 1248, 1, 0, 0, 0, 247, 1250, 1, 0, 0, 0, 249, 1252, 1, 0, 0, 0, 251, 1254, 1, 0, 0, 0, 253, 1256, 1, 0, 0, 0, 255, 1258, 1, 0, 0, 0, 257, 1260, 1, 0, 0, 0, 259, 1262, 1, 0, 0, 0, 261, 1264, 1, 0, 0, 0, 263, 1266, 1, 0, 0, 0, 265, 1268, 1, 0, 0, 0, 267, 1270, 1, 0, 0, 0, 269, 1272, 1, 0, 0, 0, 271, 1274, 1, 0, 0, 0, 273, 1276, 1, 0, 0, 0, 275, 1278, 1, 0, 0, 0, 277, 1280, 1, 0, 0, 0, 279, 1282, 1, 0, 0, 0, 281, 1284, 1, 0, 0, 0, 283, 1286, 1, 0, 0, 0, 285, 1288, 1, 0, 0, 0, 287, 1290, 1, 0, 0, 0, 289, 1292, 1, 0, 0, 0, 291, 1295, 1, 0, 0, 0, 293, 1297, 1, 0, 0, 0, 295, 1299, 1, 0, 0, 0, 297, 1301, 1, 0, 0, 0, 299, 1303, 1, 0, 0, 0, 301, 1305, 1, 0, 0, 0, 303, 1308, 1, 0, 0, 0, 305, 1310, 1, 0, 0, 0, 307, 1312, 1, 0, 0, 0, 309, 1314, 1, 0, 0, 0, 311, 1317, 1, 0, 0, 0, 313, 1319, 1, 0, 0, 0, 315, 1322, 1, 0, 0, 0, 317, 1324, 1, 0, 0, 0, 319, 1326, 1, 0, 0, 0, 321, 1329, 1, 0, 0, 0, 323, 1333, 1, 0, 0, 0, 325, 1337, 1, 0, 0, 0, 327, 1339, 1, 0, 0, 0, 329, 1341, 1, 0, 0, 0, 331, 1344, 1, 0, 0, 0, 333, 1350, 1, 0, 0, 0, 335, 1352, 1, 0, 0, 0, 337, 1356, 1, 0, 0, 0, 339, 1359, 1, 0, 0, 0, 341, 1362, 1, 0, 0, 0, 343, 1365, 1, 0, 0, 0, 345, 1367, 1, 0, 0, 0, 347, 1369, 1, 0, 0, 0, 349, 1371, 1, 0, 0, 0, 351, 1373, 1, 0, 0, 0, 353, 1378, 1, 0, 0, 0, 355, 1383, 1, 0, 0, 0, 357, 1385, 1, 0, 0, 0, 359, 1387, 1, 0, 0, 0, 361, 1390, 1, 0, 0, 0, 363, 1394, 1, 0, 0, 0, 365, 1396, 1, 0, 0, 0, 367, 1398, 1, 0, 0, 0, 369, 1400, 1, 0, 0, 0, 371, 1402, 1, 0, 0, 0, 373, 1404, 1, 0, 0, 0, 375, 1422, 1, 0, 0, 0, 377, 1435, 1, 0, 0, 0, 379, 1450, 1, 0, 0, 0, 381, 1454, 1, 0, 0, 0, 383, 1458, 1, 0, 0, 0, 385, 1468, 1, 0, 0, 0, 387, 1472, 1, 0, 0, 0, 389, 390, 3, 229, 113, 0, 390, 391, 3, 251, 124, 0, 391, 392, 3, 251, 124, 0, 392, 4, 1, 0, 0, 0, 393, 394, 3, 229, 113, 0, 394, 395, 3, 255, 126, 0, 395, 396, 3, 235, 116, 0, 396, 6, 1, 0, 0, 0, 397, 398, 3, 229, 113, 0, 398, 399, 3, 255, 126, 0, 399, 400, 3, 267, 132, 0, 400, 401, 3, 245, 121, 0, 401, 8, 1, 0, 0, 0, 402, 403, 3, 229, 113, 0, 403, 404, 3, 255, 126, 0, 404, 405, 3, 277, 137, 0, 405, 10, 1, 0, 0, 0, 406, 407, 3, 229, 113, 0, 407, 408, 3, 263, 130, 0, 408, 409, 3, 263, 130, 0, 409, 410, 3, 229, 113, 0, 410, 411, 3, 277, 137, 0, 411, 12, 1, 0, 0, 0, 412, 413, 3, 229, 113, 0, 413, 414, 3, 265, 131, 0, 414, 14, 1, 0, 0, 0, 415, 416, 3, 229, 113, 0, 416, 417, 3, 265, 131, 0, 417, 418, 3, 233, 115, 0, 418, 430, 1, 0, 0, 0, 419, 420, 3, 229, 113, 0, 420, 421, 3, 265, 131, 0, 421, 422, 3, 233, 115, 0, 422, 423, 3, 237, 117, 0, 423, 424, 3, 255, 126, 0, 424, 425, 3, 235, 116, 0, 425, 426, 3, 245, 121, 0, 426, 427, 3, 255, 126, 0, 427, 428, 3, 241, 119, 0, 428, 430, 1, 0, 0, 0, 429, 415, 1, 0, 0, 0, 429, 419, 1, 0, 0, 0, 430, 16, 1, 0, 0, 0, 431, 432, 3, 229, 113, 0, 432, 433, 3, 265, 131, 0, 433, 434, 3, 257, 127, 0, 434, 435, 3, 239, 118, 0, 435, 18, 1, 0, 0, 0, 436, 437, 3, 231, 114, 0, 437, 438, 3, 237, 117, 0, 438, 439, 3, 267, 132, 0, 439, 440, 3, 273, 135, 0, 440, 441, 3, 237, 117, 0, 441, 442, 3, 237, 117, 0, 442, 443, 3, 255, 126, 0, 443, 20, 1, 0, 0, 0, 444, 445, 3, 231, 114, 0, 445, 446, 3, 257, 127, 0, 446, 447, 3, 267, 132, 0, 447, 448, 3, 243, 120, 0, 448, 22, 1, 0, 0, 0, 449, 450, 3, 231, 114, 0, 450, 451, 3, 277, 137, 0, 451, 24, 1, 0, 0, 0, 452, 453, 3, 233, 115, 0, 453, 454, 3, 229, 113, 0, 454, 455, 3, 265, 131, 0, 455, 456, 3, 237, 117, 0, 456, 26, 1, 0, 0, 0, 457, 458, 3, 233, 115, 0, 458, 459, 3, 229, 113, 0, 459, 460, 3, 265, 131, 0, 460, 461, 3, 267, 132, 0, 461, 28, 1, 0, 0, 0, 462, 463, 3, 233, 115, 0, 463, 464, 3, 229, 113, 0, 464, 465, 3, 267, 132, 0, 465, 466, 3, 233, 115, 0, 466, 467, 3, 243, 120, 0, 467, 30, 1, 0, 0, 0, 468, 469, 3, 233, 115, 0, 469, 470, 3, 257, 127, 0, 470, 471, 3, 243, 120, 0, 471, 472, 3, 257, 127, 0, 472, 473, 3, 263, 130, 0, 473, 474, 3, 267, 132, 0, 474, 32, 1, 0, 0, 0, 475, 476, 3, 233, 115, 0, 476, 477, 3, 257, 127, 0, 477, 478, 3, 251, 124, 0, 478, 479, 3, 251, 124, 0, 479, 480, 3, 229, 113, 0, 480, 481, 3, 267, 132, 0, 481, 482, 3, 237, 117, 0, 482, 34, 1, 0, 0, 0, 483, 484, 3, 233, 115, 0, 484, 485, 3, 263, 130, 0, 485, 486, 3, 257, 127, 0, 486, 487, 3, 265, 131, 0, 487, 488, 3, 265, 131, 0, 488, 36, 1, 0, 0, 0, 489, 490, 3, 233, 115, 0, 490, 491, 3, 269, 133, 0, 491, 492, 3, 231, 114, 0, 492, 493, 3, 237, 117, 0, 493, 38, 1, 0, 0, 0, 494, 495, 3, 233, 115, 0, 495, 496, 3, 269, 133, 0, 496, 497, 3, 263, 130, 0, 497, 498, 3, 263, 130, 0, 498, 499, 3, 237, 117, 0, 499, 500, 3, 255, 126, 0, 500, 501, 3, 267, 132, 0, 501, 40, 1, 0, 0, 0, 502, 503, 3, 235, 116, 0, 503, 504, 3, 229, 113, 0, 504, 505, 3, 267, 132, 0, 505, 506, 3, 237, 117, 0, 506, 42, 1, 0, 0, 0, 507, 508, 3, 235, 116, 0, 508, 509, 3, 229, 113, 0, 509, 510, 3, 277, 137, 0, 510, 44, 1, 0, 0, 0, 511, 512, 3, 235, 116, 0, 512, 513, 3, 237, 117, 0, 513, 514, 3, 265, 131, 0, 514, 515, 3, 233, 115, 0, 515, 46, 1, 0, 0, 0, 516, 517, 3, 235, 116, 0, 517, 518, 3, 237, 117, 0, 518, 519, 3, 265, 131, 0, 519, 520, 3, 233, 115, 0, 520, 521, 3, 237, 117, 0, 521, 522, 3, 255, 126, 0, 522, 523, 3, 235, 116, 0, 523, 524, 3, 245, 121, 0, 524, 525, 3, 255, 126, 0, 525, 526, 3, 241, 119, 0, 526, 48, 1, 0, 0, 0, 527, 528, 3, 235, 116, 0, 528, 529, 3, 245, 121, 0, 529, 530, 3, 265, 131, 0, 530, 531, 3, 267, 132, 0, 531, 532, 3, 245, 121, 0, 532, 533, 3, 255, 126, 0, 533, 534, 3, 233, 115, 0, 534, 535, 3, 267, 132, 0, 535, 50, 1, 0, 0, 0, 536, 537, 3, 237, 117, 0, 537, 538, 3, 251, 124, 0, 538, 539, 3, 265, 131, 0, 539, 540, 3, 237, 117, 0, 540, 52, 1, 0, 0, 0, 541, 542, 3, 237, 117, 0, 542, 543, 3, 255, 126, 0, 543, 544, 3, 235, 116, 0, 544, 54, 1, 0, 0, 0, 545, 546, 3, 237, 117, 0, 546, 547, 3, 275, 136, 0, 547, 548, 3, 233, 115, 0, 548, 549, 3, 237, 117, 0, 549, 550, 3, 259, 128, 0, 550, 551, 3, 267, 132, 0, 551, 56, 1, 0, 0, 0, 552, 553, 3, 237, 117, 0, 553, 554, 3, 275, 136, 0, 554, 555, 3, 267, 132, 0, 555, 556, 3, 263, 130, 0, 556, 557, 3, 229, 113, 0, 557, 558, 3, 233, 115, 0, 558, 559, 3, 267, 132, 0, 559, 58, 1, 0, 0, 0, 560, 561, 3, 239, 118, 0, 561, 562, 3, 245, 121, 0, 562, 563, 3, 255, 126, 0, 563, 564, 3, 229, 113, 0, 564, 565, 3, 251, 124, 0, 565, 60, 1, 0, 0, 0, 566, 567, 3, 239, 118, 0, 567, 568, 3, 245, 121, 0, 568, 569, 3, 255, 126, 0, 569, 570, 3, 229, 113, 0, 570, 571, 3, 251, 124, 0, 571, 572, 3, 251, 124, 0, 572, 573, 3, 277, 137, 0, 573, 62, 1, 0, 0, 0, 574, 575, 3, 239, 118, 0, 575, 576, 3, 245, 121, 0, 576, 577, 3, 263, 130, 0, 577, 578, 3, 265, 131, 0, 578, 579, 3, 267, 132, 0, 579, 64, 1, 0, 0, 0, 580, 581, 3, 239, 118, 0, 581, 582, 3, 255, 126, 0, 582, 66, 1, 0, 0, 0, 583, 584, 3, 239, 118, 0, 584, 585, 3, 257, 127, 0, 585, 586, 3, 251, 124, 0, 586, 587, 3, 251, 124, 0, 587, 588, 3, 257, 127, 0, 588, 589, 3, 273, 135, 0, 589, 590, 3, 245, 121, 0, 590, 591, 3, 255, 126, 0, 591, 592, 3, 241, 119, 0, 592, 68, 1, 0, 0, 0, 593, 594, 3, 239, 118, 0, 594, 595, 3, 257, 127, 0, 595, 596, 3, 263, 130, 0, 596, 70, 1, 0, 0, 0, 597, 598, 3, 239, 118, 0, 598, 599, 3, 263, 130, 0, 599, 600, 3, 257, 127, 0, 600, 601, 3, 253, 125, 0, 601, 72, 1, 0, 0, 0, 602, 603, 3, 239, 118, 0, 603, 604, 3, 269, 133, 0, 604, 605, 3, 251, 124, 0, 605, 606, 3, 251, 124, 0, 606, 74, 1, 0, 0, 0, 607, 608, 3, 239, 118, 0, 608, 609, 3, 269, 133, 0, 609, 610, 3, 255, 126, 0, 610, 76, 1, 0, 0, 0, 611, 612, 3, 241, 119, 0, 612, 613, 3, 263, 130, 0, 613, 614, 3, 257, 127, 0, 614, 615, 3, 269, 133, 0, 615, 616, 3, 259, 128, 0, 616, 78, 1, 0, 0, 0, 617, 618, 3, 243, 120, 0, 618, 619, 3, 229, 113, 0, 619, 620, 3, 271, 134, 0, 620, 621, 3, 245, 121, 0, 621, 622, 3, 255, 126, 0, 622, 623, 3, 241, 119, 0, 623, 80, 1, 0, 0, 0, 624, 625, 3, 243, 120, 0, 625, 626, 3, 257, 127, 0, 626, 627, 3, 269, 133, 0, 627, 628, 3, 263, 130, 0, 628, 82, 1, 0, 0, 0, 629, 630, 3, 245, 121, 0, 630, 631, 3, 235, 116, 0, 631, 84, 1, 0, 0, 0, 632, 633, 3, 245, 121, 0, 633, 634, 3, 239, 118, 0, 634, 86, 1, 0, 0, 0, 635, 636, 3, 245, 121, 0, 636, 637, 3, 251, 124, 0, 637, 638, 3, 245, 121, 0, 638, 639, 3, 249, 123, 0, 639, 640, 3, 237, 117, 0, 640, 88, 1, 0, 0, 0, 641, 642, 3, 245, 121, 0, 642, 643, 3, 255, 126, 0, 643, 90, 1, 0, 0, 0, 644, 645, 3, 245, 121, 0, 645, 646, 3, 255, 126, 0, 646, 647, 3, 239, 118, 0, 647, 658, 1, 0, 0, 0, 648, 649, 3, 245, 121, 0, 649, 650, 3, 255, 126, 0, 650, 651, 3, 239, 118, 0, 651, 652, 3, 245, 121, 0, 652, 653, 3, 255, 126, 0, 653, 654, 3, 245, 121, 0, 654, 655, 3, 267, 132, 0, 655, 656, 3, 277, 137, 0, 656, 658, 1, 0, 0, 0, 657, 644, 1, 0, 0, 0, 657, 648, 1, 0, 0, 0, 658, 92, 1, 0, 0, 0, 659, 660, 3, 245, 121, 0, 660, 661, 3, 255, 126, 0, 661, 662, 3, 255, 126, 0, 662, 663, 3, 237, 117, 0, 663, 664, 3, 263, 130, 0, 664, 94, 1, 0, 0, 0, 665, 666, 3, 245, 121, 0, 666, 667, 3, 255, 126, 0, 667, 668, 3, 267, 132, 0, 668, 669, 3, 237, 117, 0, 669, 670, 3, 263, 130, 0, 670, 671, 3, 265, 131, 0, 671, 672, 3, 237, 117, 0, 672, 673, 3, 233, 115, 0, 673, 674, 3, 267, 132, 0, 674, 96, 1, 0, 0, 0, 675, 676, 3, 245, 121, 0, 676, 677, 3, 255, 126, 0, 677, 678, 3, 267, 132, 0, 678, 679, 3, 237, 117, 0, 679, 680, 3, 263, 130, 0, 680, 681, 3, 271, 134, 0, 681, 682, 3, 229, 113, 0, 682, 683, 3, 251, 124, 0, 683, 98, 1, 0, 0, 0, 684, 685, 3, 245, 121, 0, 685, 686, 3, 265, 131, 0, 686, 100, 1, 0, 0, 0, 687, 688, 3, 247, 122, 0, 688, 689, 3, 257, 127, 0, 689, 690, 3, 245, 121, 0, 690, 691, 3, 255, 126, 0, 691, 102, 1, 0, 0, 0, 692, 693, 3, 249, 123, 0, 693, 694, 3, 237, 117, 0, 694, 695, 3, 277, 137, 0, 695, 104, 1, 0, 0, 0, 696, 697, 3, 251, 124, 0, 697, 698, 3, 229, 113, 0, 698, 699, 3, 265, 131, 0, 699, 700, 3, 267, 132, 0, 700, 106, 1, 0, 0, 0, 701, 702, 3, 251, 124, 0, 702, 703, 3, 237, 117, 0, 703, 704, 3, 229, 113, 0, 704, 705, 3, 235, 116, 0, 705, 706, 3, 245, 121, 0, 706, 707, 3, 255, 126, 0, 707, 708, 3, 241, 119, 0, 708, 108, 1, 0, 0, 0, 709, 710, 3, 251, 124, 0, 710, 711, 3, 237, 117, 0, 711, 712, 3, 239, 118, 0, 712, 713, 3, 267, 132, 0, 713, 110, 1, 0, 0, 0, 714, 715, 3, 251, 124, 0, 715, 716, 3, 237, 117, 0, 716, 717, 3, 267, 132, 0, 717, 112, 1, 0, 0, 0, 718, 719, 3, 251, 124, 0, 719, 720, 3, 245, 121, 0, 720, 721, 3, 249, 123, 0, 721, 722, 3, 237, 117, 0, 722, 114, 1, 0, 0, 0, 723, 724, 3, 251, 124, 0, 724, 725, 3, 245, 121, 0, 725, 726, 3, 253, 125, 0, 726, 727, 3, 245, 121, 0, 727, 728, 3, 267, 132, 0, 728, 116, 1, 0, 0, 0, 729, 730, 3, 253, 125, 0, 730, 731, 3, 245, 121, 0, 731, 732, 3, 255, 126, 0, 732, 733, 3, 269, 133, 0, 733, 734, 3, 267, 132, 0, 734, 735, 3, 237, 117, 0, 735, 118, 1, 0, 0, 0, 736, 737, 3, 253, 125, 0, 737, 738, 3, 257, 127, 0, 738, 739, 3, 255, 126, 0, 739, 740, 3, 267, 132, 0, 740, 741, 3, 243, 120, 0, 741, 120, 1, 0, 0, 0, 742, 743, 3, 255, 126, 0, 743, 744, 3, 229, 113, 0, 744, 745, 3, 255, 126, 0, 745, 122, 1, 0, 0, 0, 746, 747, 3, 255, 126, 0, 747, 748, 3, 257, 127, 0, 748, 749, 3, 267, 132, 0, 749, 124, 1, 0, 0, 0, 750, 751, 3, 255, 126, 0, 751, 752, 3, 269, 133, 0, 752, 753, 3, 251, 124, 0, 753, 754, 3, 251, 124, 0, 754, 126, 1, 0, 0, 0, 755, 756, 3, 255, 126, 0, 756, 757, 3, 269, 133, 0, 757, 758, 3, 251, 124, 0, 758, 759, 3, 251, 124, 0, 759, 760, 3, 265, 131, 0, 760, 128, 1, 0, 0, 0, 761, 762, 3, 257, 127, 0, 762, 763, 3, 239, 118, 0, 763, 764, 3, 239, 118, 0, 764, 765, 3, 265, 131, 0, 765, 766, 3, 237, 117, 0, 766, 767, 3, 267, 132, 0, 767, 130, 1, 0, 0, 0, 768, 769, 3, 257, 127, 0, 769, 770, 3, 255, 126, 0, 770, 132, 1, 0, 0, 0, 771, 772, 3, 257, 127, 0, 772, 773, 3, 263, 130, 0, 773, 134, 1, 0, 0, 0, 774, 775, 3, 257, 127, 0, 775, 776, 3, 263, 130, 0, 776, 777, 3, 235, 116, 0, 777, 778, 3, 237, 117, 0, 778, 779, 3, 263, 130, 0, 779, 136, 1, 0, 0, 0, 780, 781, 3, 257, 127, 0, 781, 782, 3, 269, 133, 0, 782, 783, 3, 267, 132, 0, 783, 784, 3, 237, 117, 0, 784, 785, 3, 263, 130, 0, 785, 138, 1, 0, 0, 0, 786, 787, 3, 257, 127, 0, 787, 788, 3, 271, 134, 0, 788, 789, 3, 237, 117, 0, 789, 790, 3, 263, 130, 0, 790, 140, 1, 0, 0, 0, 791, 792, 3, 259, 128, 0, 792, 793, 3, 229, 113, 0, 793, 794, 3, 263, 130, 0, 794, 795, 3, 267, 132, 0, 795, 796, 3, 245, 121, 0, 796, 797, 3, 267, 132, 0, 797, 798, 3, 245, 121, 0, 798, 799, 3, 257, 127, 0, 799, 800, 3, 255, 126, 0, 800, 142, 1, 0, 0, 0, 801, 802, 3, 259, 128, 0, 802, 803, 3, 263, 130, 0, 803, 804, 3, 237, 117, 0, 804, 805, 3, 233, 115, 0, 805, 806, 3, 237, 117, 0, 806, 807, 3, 235, 116, 0, 807, 808, 3, 245, 121, 0, 808, 809, 3, 255, 126, 0, 809, 810, 3, 241, 119, 0, 810, 144, 1, 0, 0, 0, 811, 812, 3, 259, 128, 0, 812, 813, 3, 263, 130, 0, 813, 814, 3, 237, 117, 0, 814, 815, 3, 273, 135, 0, 815, 816, 3, 243, 120, 0, 816, 817, 3, 237, 117, 0, 817, 818, 3, 263, 130, 0, 818, 819, 3, 237, 117, 0, 819, 146, 1, 0, 0, 0, 820, 821, 3, 261, 129, 0, 821, 822, 3, 269, 133, 0, 822, 823, 3, 229, 113, 0, 823, 824, 3, 263, 130, 0, 824, 825, 3, 267, 132, 0, 825, 826, 3, 237, 117, 0, 826, 827, 3, 263, 130, 0, 827, 148, 1, 0, 0, 0, 828, 829, 3, 263, 130, 0, 829, 830, 3, 229, 113, 0, 830, 831, 3, 255, 126, 0, 831, 832, 3, 241, 119, 0, 832, 833, 3, 237, 117, 0, 833, 150, 1, 0, 0, 0, 834, 835, 3, 263, 130, 0, 835, 836, 3, 237, 117, 0, 836, 837, 3, 267, 132, 0, 837, 838, 3, 269, 133, 0, 838, 839, 3, 263, 130, 0, 839, 840, 3, 255, 126, 0, 840, 152, 1, 0, 0, 0, 841, 842, 3, 263, 130, 0, 842, 843, 3, 245, 121, 0, 843, 844, 3, 241, 119, 0, 844, 845, 3, 243, 120, 0, 845, 846, 3, 267, 132, 0, 846, 154, 1, 0, 0, 0, 847, 848, 3, 263, 130, 0, 848, 849, 3, 257, 127, 0, 849, 850, 3, 251, 124, 0, 850, 851, 3, 251, 124, 0, 851, 852, 3, 269, 133, 0, 852, 853, 3, 259, 128, 0, 853, 156, 1, 0, 0, 0, 854, 855, 3, 263, 130, 0, 855, 856, 3, 257, 127, 0, 856, 857, 3, 273, 135, 0, 857, 158, 1, 0, 0, 0, 858, 859, 3, 263, 130, 0, 859, 860, 3, 257, 127, 0, 860, 861, 3, 273, 135, 0, 861, 862, 3, 265, 131, 0, 862, 160, 1, 0, 0, 0, 863, 864, 3, 265, 131, 0, 864, 865, 3, 229, 113, 0, 865, 866, 3, 253, 125, 0, 866, 867, 3, 259, 128, 0, 867, 868, 3, 251, 124, 0, 868, 869, 3, 237, 117, 0, 869, 162, 1, 0, 0, 0, 870, 871, 3, 265, 131, 0, 871, 872, 3, 237, 117, 0, 872, 873, 3, 233, 115, 0, 873, 874, 3, 257, 127, 0, 874, 875, 3, 255, 126, 0, 875, 876, 3, 235, 116, 0, 876, 164, 1, 0, 0, 0, 877, 878, 3, 265, 131, 0, 878, 879, 3, 237, 117, 0, 879, 880, 3, 251, 124, 0, 880, 881, 3, 237, 117, 0, 881, 882, 3, 233, 115, 0, 882, 883, 3, 267, 132, 0, 883, 166, 1, 0, 0, 0, 884, 885, 3, 265, 131, 0, 885, 886, 3, 237, 117, 0, 886, 887, 3, 253, 125, 0, 887, 888, 3, 245, 121, 0, 888, 168, 1, 0, 0, 0, 889, 890, 3, 265, 131, 0, 890, 891, 3, 237, 117, 0, 891, 892, 3, 267, 132, 0, 892, 893, 3, 267, 132, 0, 893, 894, 3, 245, 121, 0, 894, 895, 3, 255, 126, 0, 895, 896, 3, 241, 119, 0, 896, 897, 3, 265, 131, 0, 897, 170, 1, 0, 0, 0, 898, 899, 3, 265, 131, 0, 899, 900, 3, 269, 133, 0, 900, 901, 3, 231, 114, 0, 901, 902, 3, 265, 131, 0, 902, 903, 3, 267, 132, 0, 903, 904, 3, 263, 130, 0, 904, 905, 3, 245, 121, 0, 905, 906, 3, 255, 126, 0, 906, 907, 3, 241, 119, 0, 907, 172, 1, 0, 0, 0, 908, 909, 3, 267, 132, 0, 909, 910, 3, 243, 120, 0, 910, 911, 3, 237, 117, 0, 911, 912, 3, 255, 126, 0, 912, 174, 1, 0, 0, 0, 913, 914, 3, 267, 132, 0, 914, 915, 3, 243, 120, 0, 915, 916, 3, 263, 130, 0, 916, 917, 3, 257, 127, 0, 917, 918, 3, 273, 135, 0, 918, 176, 1, 0, 0, 0, 919, 920, 3, 267, 132, 0, 920, 921, 3, 245, 121, 0, 921, 922, 3, 237, 117, 0, 922, 923, 3, 265, 131, 0, 923, 178, 1, 0, 0, 0, 924, 925, 3, 267, 132, 0, 925, 926, 3, 245, 121, 0, 926, 927, 3, 253, 125, 0, 927, 928, 3, 237, 117, 0, 928, 929, 3, 265, 131, 0, 929, 930, 3, 267, 132, 0, 930, 931, 3, 229, 113, 0, 931, 932, 3, 253, 125, 0, 932, 933, 3, 259, 128, 0, 933, 180, 1, 0, 0, 0, 934, 935, 3, 267, 132, 0, 935, 936, 3, 257, 127, 0, 936, 182, 1, 0, 0, 0, 937, 938, 3, 267, 132, 0, 938, 939, 3, 257, 127, 0, 939, 940, 3, 259, 128, 0, 940, 184, 1, 0, 0, 0, 941, 942, 3, 267, 132, 0, 942, 943, 3, 257, 127, 0, 943, 944, 3, 267, 132, 0, 944, 945, 3, 229, 113, 0, 945, 946, 3, 251, 124, 0, 946, 947, 3, 265, 131, 0, 947, 186, 1, 0, 0, 0, 948, 949, 3, 267, 132, 0, 949, 950, 3, 263, 130, 0, 950, 951, 3, 229, 113, 0, 951, 952, 3, 245, 121, 0, 952, 953, 3, 251, 124, 0, 953, 954, 3, 245, 121, 0, 954, 955, 3, 255, 126, 0, 955, 956, 3, 241, 119, 0, 956, 188, 1, 0, 0, 0, 957, 958, 3, 267, 132, 0, 958, 959, 3, 263, 130, 0, 959, 960, 3, 245, 121, 0, 960, 961, 3, 253, 125, 0, 961, 190, 1, 0, 0, 0, 962, 963, 3, 267, 132, 0, 963, 964, 3, 263, 130, 0, 964, 965, 3, 269, 133, 0, 965, 966, 3, 255, 126, 0, 966, 967, 3, 233, 115, 0, 967, 968, 3, 229, 113, 0, 968, 969, 3, 267, 132, 0, 969, 970, 3, 237, 117, 0, 970, 192, 1, 0, 0, 0, 971, 972, 3, 267, 132, 0, 972, 973, 3, 263, 130, 0, 973, 974, 3, 277, 137, 0, 974, 194, 1, 0, 0, 0, 975, 976, 3, 269, 133, 0, 976, 977, 3, 255, 126, 0, 977, 978, 3, 231, 114, 0, 978, 979, 3, 257, 127, 0, 979, 980, 3, 269, 133, 0, 980, 981, 3, 255, 126, 0, 981, 982, 3, 235, 116, 0, 982, 983, 3, 237, 117, 0, 983, 984, 3, 235, 116, 0, 984, 196, 1, 0, 0, 0, 985, 986, 3, 269, 133, 0, 986, 987, 3, 255, 126, 0, 987, 988, 3, 245, 121, 0, 988, 989, 3, 257, 127, 0, 989, 990, 3, 255, 126, 0, 990, 198, 1, 0, 0, 0, 991, 992, 3, 269, 133, 0, 992, 993, 3, 265, 131, 0, 993, 994, 3, 245, 121, 0, 994, 995, 3, 255, 126, 0, 995, 996, 3, 241, 119, 0, 996, 200, 1, 0, 0, 0, 997, 998, 3, 273, 135, 0, 998, 999, 3, 237, 117, 0, 999, 1000, 3, 237, 117, 0, 1000, 1001, 3, 249, 123, 0, 1001, 202, 1, 0, 0, 0, 1002, 1003, 3, 273, 135, 0, 1003, 1004, 3, 243, 120, 0, 1004, 1005, 3, 237, 117, 0, 1005, 1006, 3, 255, 126, 0, 1006, 204, 1, 0, 0, 0, 1007, 1008, 3, 273, 135, 0, 1008, 1009, 3, 243, 120, 0, 1009, 1010, 3, 237, 117, 0, 1010, 1011, 3, 263, 130, 0, 1011, 1012, 3, 237, 117, 0, 1012, 206, 1, 0, 0, 0, 1013, 1014, 3, 273, 135, 0, 1014, 1015, 3, 243, 120, 0, 1015, 1016, 3, 245, 121, 0, 1016, 1017, 3, 251, 124, 0, 1017, 1018, 3, 237, 117, 0, 1018, 208, 1, 0, 0, 0, 1019, 1020, 3, 273, 135, 0, 1020, 1021, 3, 245, 121, 0, 1021, 1022, 3, 255, 126, 0, 1022, 1023, 3, 235, 116, 0, 1023, 1024, 3, 257, 127, 0, 1024, 1025, 3, 273, 135, 0, 1025, 210, 1, 0, 0, 0, 1026, 1027, 3, 273, 135, 0, 1027, 1028, 3, 245, 121, 0, 1028, 1029, 3, 267, 132, 0, 1029, 1030, 3, 243, 120, 0, 1030, 212, 1, 0, 0, 0, 1031, 1032, 3, 277, 137, 0, 1032, 1033, 3, 237, 117, 0, 1033, 1034, 3, 229, 113, 0, 1034, 1035, 3, 263, 130, 0, 1035, 1042, 1, 0, 0, 0, 1036, 1037, 3, 277, 137, 0, 1037, 1038, 3, 277, 137, 0, 1038, 1039, 3, 277, 137, 0, 1039, 1040, 3, 277, 137, 0, 1040, 1042, 1, 0, 0, 0, 1041, 1031, 1, 0, 0, 0, 1041, 1036, 1, 0, 0, 0, 1042, 214, 1, 0, 0, 0, 1043, 1044, 3, 295, 146, 0, 1044, 1045, 3, 231, 114, 0, 1045, 1071, 1, 0, 0, 0, 1046, 1047, 3, 295, 146, 0, 1047, 1048, 3, 239, 118, 0, 1048, 1071, 1, 0, 0, 0, 1049, 1050, 3, 295, 146, 0, 1050, 1051, 3, 263, 130, 0, 1051, 1071, 1, 0, 0, 0, 1052, 1053, 3, 295, 146, 0, 1053, 1054, 3, 255, 126, 0, 1054, 1071, 1, 0, 0, 0, 1055, 1056, 3, 295, 146, 0, 1056, 1057, 3, 267, 132, 0, 1057, 1071, 1, 0, 0, 0, 1058, 1059, 3, 295, 146, 0, 1059, 1060, 5, 48, 0, 0, 1060, 1071, 1, 0, 0, 0, 1061, 1062, 3, 295, 146, 0, 1062, 1063, 3, 229, 113, 0, 1063, 1071, 1, 0, 0, 0, 1064, 1065, 3, 295, 146, 0, 1065, 1066, 3, 271, 134, 0, 1066, 1071, 1, 0, 0, 0, 1067, 1068, 3, 295, 146, 0, 1068, 1069, 3, 295, 146, 0, 1069, 1071, 1, 0, 0, 0, 1070, 1043, 1, 0, 0, 0, 1070, 1046, 1, 0, 0, 0, 1070, 1049, 1, 0, 0, 0, 1070, 1052, 1, 0, 0, 0, 1070, 1055, 1, 0, 0, 0, 1070, 1058, 1, 0, 0, 0, 1070, 1061, 1, 0, 0, 0, 1070, 1064, 1, 0, 0, 0, 1070, 1067, 1, 0, 0, 0, 1071, 216, 1, 0, 0, 0, 1072, 1076, 3, 281, 139, 0, 1073, 1076, 3, 371, 184, 0, 1074, 1076, 3, 305, 151, 0, 1075, 1072, 1, 0, 0, 0, 1075, 1073, 1, 0, 0, 0, 1075, 1074, 1, 0, 0, 0, 1076, 1083, 1, 0, 0, 0, 1077, 1082, 3, 281, 139, 0, 1078, 1082, 3, 371, 184, 0, 1079, 1082, 3, 285, 141, 0, 1080, 1082, 3, 305, 151, 0, 1081, 1077, 1, 0, 0, 0, 1081, 1078, 1, 0, 0, 0, 1081, 1079, 1, 0, 0, 0, 1081, 1080, 1, 0, 0, 0, 1082, 1085, 1, 0, 0, 0, 1083, 1081, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1119, 1, 0, 0, 0, 1085, 1083, 1, 0, 0, 0, 1086, 1097, 3, 293, 145, 0, 1087, 1096, 8, 0, 0, 0, 1088, 1096, 3, 215, 106, 0, 1089, 1090, 3, 295, 146, 0, 1090, 1091, 3, 355, 176, 0, 1091, 1096, 1, 0, 0, 0, 1092, 1093, 3, 293, 145, 0, 1093, 1094, 3, 293, 145, 0, 1094, 1096, 1, 0, 0, 0, 1095, 1087, 1, 0, 0, 0, 1095, 1088, 1, 0, 0, 0, 1095, 1089, 1, 0, 0, 0, 1095, 1092, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1101, 3, 293, 145, 0, 1101, 1119, 1, 0, 0, 0, 1102, 1113, 3, 349, 173, 0, 1103, 1112, 8, 1, 0, 0, 1104, 1112, 3, 215, 106, 0, 1105, 1106, 3, 295, 146, 0, 1106, 1107, 3, 349, 173, 0, 1107, 1112, 1, 0, 0, 0, 1108, 1109, 3, 349, 173, 0, 1109, 1110, 3, 349, 173, 0, 1110, 1112, 1, 0, 0, 0, 1111, 1103, 1, 0, 0, 0, 1111, 1104, 1, 0, 0, 0, 1111, 1105, 1, 0, 0, 0, 1111, 1108, 1, 0, 0, 0, 1112, 1115, 1, 0, 0, 0, 1113, 1111, 1, 0, 0, 0, 1113, 1114, 1, 0, 0, 0, 1114, 1116, 1, 0, 0, 0, 1115, 1113, 1, 0, 0, 0, 1116, 1117, 3, 349, 173, 0, 1117, 1119, 1, 0, 0, 0, 1118, 1075, 1, 0, 0, 0, 1118, 1086, 1, 0, 0, 0, 1118, 1102, 1, 0, 0, 0, 1119, 218, 1, 0, 0, 0, 1120, 1121, 3, 225, 111, 0, 1121, 1125, 3, 307, 152, 0, 1122, 1124, 3, 287, 142, 0, 1123, 1122, 1, 0, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1123, 1, 0, 0, 0, 1125, 1126, 1, 0, 0, 0, 1126, 1130, 1, 0, 0, 0, 1127, 1125, 1, 0, 0, 0, 1128, 1131, 3, 259, 128, 0, 1129, 1131, 3, 237, 117, 0, 1130, 1128, 1, 0, 0, 0, 1130, 1129, 1, 0, 0, 0, 1131, 1134, 1, 0, 0, 0, 1132, 1135, 3, 345, 171, 0, 1133, 1135, 3, 303, 150, 0, 1134, 1132, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1134, 1135, 1, 0, 0, 0, 1135, 1137, 1, 0, 0, 0, 1136, 1138, 3, 285, 141, 0, 1137, 1136, 1, 0, 0, 0, 1138, 1139, 1, 0, 0, 0, 1139, 1137, 1, 0, 0, 0, 1139, 1140, 1, 0, 0, 0, 1140, 1197, 1, 0, 0, 0, 1141, 1144, 3, 225, 111, 0, 1142, 1145, 3, 259, 128, 0, 1143, 1145, 3, 237, 117, 0, 1144, 1142, 1, 0, 0, 0, 1144, 1143, 1, 0, 0, 0, 1145, 1148, 1, 0, 0, 0, 1146, 1149, 3, 345, 171, 0, 1147, 1149, 3, 303, 150, 0, 1148, 1146, 1, 0, 0, 0, 1148, 1147, 1, 0, 0, 0, 1148, 1149, 1, 0, 0, 0, 1149, 1151, 1, 0, 0, 0, 1150, 1152, 3, 285, 141, 0, 1151, 1150, 1, 0, 0, 0, 1152, 1153, 1, 0, 0, 0, 1153, 1151, 1, 0, 0, 0, 1153, 1154, 1, 0, 0, 0, 1154, 1197, 1, 0, 0, 0, 1155, 1156, 3, 223, 110, 0, 1156, 1160, 3, 307, 152, 0, 1157, 1159, 3, 285, 141, 0, 1158, 1157, 1, 0, 0, 0, 1159, 1162, 1, 0, 0, 0, 1160, 1158, 1, 0, 0, 0, 1160, 1161, 1, 0, 0, 0, 1161, 1163, 1, 0, 0, 0, 1162, 1160, 1, 0, 0, 0, 1163, 1166, 3, 237, 117, 0, 1164, 1167, 3, 345, 171, 0, 1165, 1167, 3, 303, 150, 0, 1166, 1164, 1, 0, 0, 0, 1166, 1165, 1, 0, 0, 0, 1166, 1167, 1, 0, 0, 0, 1167, 1169, 1, 0, 0, 0, 1168, 1170, 3, 285, 141, 0, 1169, 1168, 1, 0, 0, 0, 1170, 1171, 1, 0, 0, 0, 1171, 1169, 1, 0, 0, 0, 1171, 1172, 1, 0, 0, 0, 1172, 1197, 1, 0, 0, 0, 1173, 1174, 3, 307, 152, 0, 1174, 1175, 3, 223, 110, 0, 1175, 1178, 3, 237, 117, 0, 1176, 1179, 3, 345, 171, 0, 1177, 1179, 3, 303, 150, 0, 1178, 1176, 1, 0, 0, 0, 1178, 1177, 1, 0, 0, 0, 1178, 1179, 1, 0, 0, 0, 1179, 1181, 1, 0, 0, 0, 1180, 1182, 3, 285, 141, 0, 1181, 1180, 1, 0, 0, 0, 1182, 1183, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1183, 1184, 1, 0, 0, 0, 1184, 1197, 1, 0, 0, 0, 1185, 1186, 3, 223, 110, 0, 1186, 1189, 3, 237, 117, 0, 1187, 1190, 3, 345, 171, 0, 1188, 1190, 3, 303, 150, 0, 1189, 1187, 1, 0, 0, 0, 1189, 1188, 1, 0, 0, 0, 1189, 1190, 1, 0, 0, 0, 1190, 1192, 1, 0, 0, 0, 1191, 1193, 3, 285, 141, 0, 1192, 1191, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1192, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1197, 1, 0, 0, 0, 1196, 1120, 1, 0, 0, 0, 1196, 1141, 1, 0, 0, 0, 1196, 1155, 1, 0, 0, 0, 1196, 1173, 1, 0, 0, 0, 1196, 1185, 1, 0, 0, 0, 1197, 220, 1, 0, 0, 0, 1198, 1200, 5, 48, 0, 0, 1199, 1201, 3, 283, 140, 0, 1200, 1199, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1200, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 222, 1, 0, 0, 0, 1204, 1206, 3, 285, 141, 0, 1205, 1204, 1, 0, 0, 0, 1206, 1207, 1, 0, 0, 0, 1207, 1205, 1, 0, 0, 0, 1207, 1208, 1, 0, 0, 0, 1208, 224, 1, 0, 0, 0, 1209, 1210, 5, 48, 0, 0, 1210, 1212, 3, 275, 136, 0, 1211, 1213, 3, 287, 142, 0, 1212, 1211, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 1212, 1, 0, 0, 0, 1214, 1215, 1, 0, 0, 0, 1215, 226, 1, 0, 0, 0, 1216, 1227, 3, 355, 176, 0, 1217, 1226, 8, 2, 0, 0, 1218, 1226, 3, 215, 106, 0, 1219, 1220, 3, 295, 146, 0, 1220, 1221, 3, 355, 176, 0, 1221, 1226, 1, 0, 0, 0, 1222, 1223, 3, 355, 176, 0, 1223, 1224, 3, 355, 176, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1219, 1, 0, 0, 0, 1225, 1222, 1, 0, 0, 0, 1226, 1229, 1, 0, 0, 0, 1227, 1225, 1, 0, 0, 0, 1227, 1228, 1, 0, 0, 0, 1228, 1230, 1, 0, 0, 0, 1229, 1227, 1, 0, 0, 0, 1230, 1231, 3, 355, 176, 0, 1231, 228, 1, 0, 0, 0, 1232, 1233, 7, 3, 0, 0, 1233, 230, 1, 0, 0, 0, 1234, 1235, 7, 4, 0, 0, 1235, 232, 1, 0, 0, 0, 1236, 1237, 7, 5, 0, 0, 1237, 234, 1, 0, 0, 0, 1238, 1239, 7, 6, 0, 0, 1239, 236, 1, 0, 0, 0, 1240, 1241, 7, 7, 0, 0, 1241, 238, 1, 0, 0, 0, 1242, 1243, 7, 8, 0, 0, 1243, 240, 1, 0, 0, 0, 1244, 1245, 7, 9, 0, 0, 1245, 242, 1, 0, 0, 0, 1246, 1247, 7, 10, 0, 0, 1247, 244, 1, 0, 0, 0, 1248, 1249, 7, 11, 0, 0, 1249, 246, 1, 0, 0, 0, 1250, 1251, 7, 12, 0, 0, 1251, 248, 1, 0, 0, 0, 1252, 1253, 7, 13, 0, 0, 1253, 250, 1, 0, 0, 0, 1254, 1255, 7, 14, 0, 0, 1255, 252, 1, 0, 0, 0, 1256, 1257, 7, 15, 0, 0, 1257, 254, 1, 0, 0, 0, 1258, 1259, 7, 16, 0, 0, 1259, 256, 1, 0, 0, 0, 1260, 1261, 7, 17, 0, 0, 1261, 258, 1, 0, 0, 0, 1262, 1263, 7, 18, 0, 0, 1263, 260, 1, 0, 0, 0, 1264, 1265, 7, 19, 0, 0, 1265, 262, 1, 0, 0, 0, 1266, 1267, 7, 20, 0, 0, 1267, 264, 1, 0, 0, 0, 1268, 1269, 7, 21, 0, 0, 1269, 266, 1, 0, 0, 0, 1270, 1271, 7, 22, 0, 0, 1271, 268, 1, 0, 0, 0, 1272, 1273, 7, 23, 0, 0, 1273, 270, 1, 0, 0, 0, 1274, 1275, 7, 24, 0, 0, 1275, 272, 1, 0, 0, 0, 1276, 1277, 7, 25, 0, 0, 1277, 274, 1, 0, 0, 0, 1278, 1279, 7, 26, 0, 0, 1279, 276, 1, 0, 0, 0, 1280, 1281, 7, 27, 0, 0, 1281, 278, 1, 0, 0, 0, 1282, 1283, 7, 28, 0, 0, 1283, 280, 1, 0, 0, 0, 1284, 1285, 7, 29, 0, 0, 1285, 282, 1, 0, 0, 0, 1286, 1287, 7, 30, 0, 0, 1287, 284, 1, 0, 0, 0, 1288, 1289, 7, 31, 0, 0, 1289, 286, 1, 0, 0, 0, 1290, 1291, 7, 32, 0, 0, 1291, 288, 1, 0, 0, 0, 1292, 1293, 5, 45, 0, 0, 1293, 1294, 5, 62, 0, 0, 1294, 290, 1, 0, 0, 0, 1295, 1296, 5, 42, 0, 0, 1296, 292, 1, 0, 0, 0, 1297, 1298, 5, 96, 0, 0, 1298, 294, 1, 0, 0, 0, 1299, 1300, 5, 92, 0, 0, 1300, 296, 1, 0, 0, 0, 1301, 1302, 5, 58, 0, 0, 1302, 298, 1, 0, 0, 0, 1303, 1304, 5, 44, 0, 0, 1304, 300, 1, 0, 0, 0, 1305, 1306, 5, 124, 0, 0, 1306, 1307, 5, 124, 0, 0, 1307, 302, 1, 0, 0, 0, 1308, 1309, 5, 45, 0, 0, 1309, 304, 1, 0, 0, 0, 1310, 1311, 5, 36, 0, 0, 1311, 306, 1, 0, 0, 0, 1312, 1313, 5, 46, 0, 0, 1313, 308, 1, 0, 0, 0, 1314, 1315, 5, 61, 0, 0, 1315, 1316, 5, 61, 0, 0, 1316, 310, 1, 0, 0, 0, 1317, 1318, 5, 61, 0, 0, 1318, 312, 1, 0, 0, 0, 1319, 1320, 5, 62, 0, 0, 1320, 1321, 5, 61, 0, 0, 1321, 314, 1, 0, 0, 0, 1322, 1323, 5, 62, 0, 0, 1323, 316, 1, 0, 0, 0, 1324, 1325, 5, 35, 0, 0, 1325, 318, 1, 0, 0, 0, 1326, 1327, 5, 126, 0, 0, 1327, 1328, 5, 42, 0, 0, 1328, 320, 1, 0, 0, 0, 1329, 1330, 5, 61, 0, 0, 1330, 1331, 5, 126, 0, 0, 1331, 1332, 5, 42, 0, 0, 1332, 322, 1, 0, 0, 0, 1333, 1334, 5, 123, 0, 0, 1334, 1335, 1, 0, 0, 0, 1335, 1336, 6, 160, 0, 0, 1336, 324, 1, 0, 0, 0, 1337, 1338, 5, 91, 0, 0, 1338, 326, 1, 0, 0, 0, 1339, 1340, 5, 40, 0, 0, 1340, 328, 1, 0, 0, 0, 1341, 1342, 5, 60, 0, 0, 1342, 1343, 5, 61, 0, 0, 1343, 330, 1, 0, 0, 0, 1344, 1345, 5, 60, 0, 0, 1345, 332, 1, 0, 0, 0, 1346, 1347, 5, 33, 0, 0, 1347, 1351, 5, 61, 0, 0, 1348, 1349, 5, 60, 0, 0, 1349, 1351, 5, 62, 0, 0, 1350, 1346, 1, 0, 0, 0, 1350, 1348, 1, 0, 0, 0, 1351, 334, 1, 0, 0, 0, 1352, 1353, 5, 33, 0, 0, 1353, 1354, 5, 126, 0, 0, 1354, 1355, 5, 42, 0, 0, 1355, 336, 1, 0, 0, 0, 1356, 1357, 5, 33, 0, 0, 1357, 1358, 5, 126, 0, 0, 1358, 338, 1, 0, 0, 0, 1359, 1360, 5, 63, 0, 0, 1360, 1361, 5, 46, 0, 0, 1361, 340, 1, 0, 0, 0, 1362, 1363, 5, 63, 0, 0, 1363, 1364, 5, 63, 0, 0, 1364, 342, 1, 0, 0, 0, 1365, 1366, 5, 37, 0, 0, 1366, 344, 1, 0, 0, 0, 1367, 1368, 5, 43, 0, 0, 1368, 346, 1, 0, 0, 0, 1369, 1370, 5, 63, 0, 0, 1370, 348, 1, 0, 0, 0, 1371, 1372, 5, 34, 0, 0, 1372, 350, 1, 0, 0, 0, 1373, 1374, 5, 102, 0, 0, 1374, 1375, 5, 39, 0, 0, 1375, 1376, 1, 0, 0, 0, 1376, 1377, 6, 174, 1, 0, 1377, 352, 1, 0, 0, 0, 1378, 1379, 5, 70, 0, 0, 1379, 1380, 5, 39, 0, 0, 1380, 1381, 1, 0, 0, 0, 1381, 1382, 6, 175, 2, 0, 1382, 354, 1, 0, 0, 0, 1383, 1384, 5, 39, 0, 0, 1384, 356, 1, 0, 0, 0, 1385, 1386, 5, 126, 0, 0, 1386, 358, 1, 0, 0, 0, 1387, 1388, 5, 61, 0, 0, 1388, 1389, 5, 126, 0, 0, 1389, 360, 1, 0, 0, 0, 1390, 1391, 5, 125, 0, 0, 1391, 1392, 1, 0, 0, 0, 1392, 1393, 6, 179, 3, 0, 1393, 362, 1, 0, 0, 0, 1394, 1395, 5, 93, 0, 0, 1395, 364, 1, 0, 0, 0, 1396, 1397, 5, 41, 0, 0, 1397, 366, 1, 0, 0, 0, 1398, 1399, 5, 59, 0, 0, 1399, 368, 1, 0, 0, 0, 1400, 1401, 5, 47, 0, 0, 1401, 370, 1, 0, 0, 0, 1402, 1403, 5, 95, 0, 0, 1403, 372, 1, 0, 0, 0, 1404, 1405, 5, 47, 0, 0, 1405, 1406, 5, 42, 0, 0, 1406, 1410, 1, 0, 0, 0, 1407, 1409, 9, 0, 0, 0, 1408, 1407, 1, 0, 0, 0, 1409, 1412, 1, 0, 0, 0, 1410, 1411, 1, 0, 0, 0, 1410, 1408, 1, 0, 0, 0, 1411, 1413, 1, 0, 0, 0, 1412, 1410, 1, 0, 0, 0, 1413, 1414, 5, 42, 0, 0, 1414, 1415, 5, 47, 0, 0, 1415, 1416, 1, 0, 0, 0, 1416, 1417, 6, 185, 4, 0, 1417, 374, 1, 0, 0, 0, 1418, 1419, 5, 45, 0, 0, 1419, 1423, 5, 45, 0, 0, 1420, 1421, 5, 47, 0, 0, 1421, 1423, 5, 47, 0, 0, 1422, 1418, 1, 0, 0, 0, 1422, 1420, 1, 0, 0, 0, 1423, 1427, 1, 0, 0, 0, 1424, 1426, 8, 33, 0, 0, 1425, 1424, 1, 0, 0, 0, 1426, 1429, 1, 0, 0, 0, 1427, 1425, 1, 0, 0, 0, 1427, 1428, 1, 0, 0, 0, 1428, 1431, 1, 0, 0, 0, 1429, 1427, 1, 0, 0, 0, 1430, 1432, 7, 34, 0, 0, 1431, 1430, 1, 0, 0, 0, 1432, 1433, 1, 0, 0, 0, 1433, 1434, 6, 186, 4, 0, 1434, 376, 1, 0, 0, 0, 1435, 1436, 7, 35, 0, 0, 1436, 1437, 1, 0, 0, 0, 1437, 1438, 6, 187, 5, 0, 1438, 378, 1, 0, 0, 0, 1439, 1451, 8, 36, 0, 0, 1440, 1451, 3, 215, 106, 0, 1441, 1442, 3, 295, 146, 0, 1442, 1443, 3, 355, 176, 0, 1443, 1451, 1, 0, 0, 0, 1444, 1445, 3, 295, 146, 0, 1445, 1446, 3, 323, 160, 0, 1446, 1451, 1, 0, 0, 0, 1447, 1448, 3, 355, 176, 0, 1448, 1449, 3, 355, 176, 0, 1449, 1451, 1, 0, 0, 0, 1450, 1439, 1, 0, 0, 0, 1450, 1440, 1, 0, 0, 0, 1450, 1441, 1, 0, 0, 0, 1450, 1444, 1, 0, 0, 0, 1450, 1447, 1, 0, 0, 0, 1451, 1452, 1, 0, 0, 0, 1452, 1450, 1, 0, 0, 0, 1452, 1453, 1, 0, 0, 0, 1453, 380, 1, 0, 0, 0, 1454, 1455, 3, 323, 160, 0, 1455, 1456, 1, 0, 0, 0, 1456, 1457, 6, 189, 0, 0, 1457, 382, 1, 0, 0, 0, 1458, 1459, 3, 355, 176, 0, 1459, 1460, 1, 0, 0, 0, 1460, 1461, 6, 190, 6, 0, 1461, 1462, 6, 190, 3, 0, 1462, 384, 1, 0, 0, 0, 1463, 1469, 8, 37, 0, 0, 1464, 1469, 3, 215, 106, 0, 1465, 1466, 3, 295, 146, 0, 1466, 1467, 3, 323, 160, 0, 1467, 1469, 1, 0, 0, 0, 1468, 1463, 1, 0, 0, 0, 1468, 1464, 1, 0, 0, 0, 1468, 1465, 1, 0, 0, 0, 1469, 1470, 1, 0, 0, 0, 1470, 1468, 1, 0, 0, 0, 1470, 1471, 1, 0, 0, 0, 1471, 386, 1, 0, 0, 0, 1472, 1473, 3, 323, 160, 0, 1473, 1474, 1, 0, 0, 0, 1474, 1475, 6, 192, 0, 0, 1475, 388, 1, 0, 0, 0, 44, 0, 1, 2, 429, 657, 1041, 1070, 1075, 1081, 1083, 1095, 1097, 1111, 1113, 1118, 1125, 1130, 1134, 1139, 1144, 1148, 1153, 1160, 1166, 1171, 1178, 1183, 1189, 1194, 1196, 1202, 1207, 1214, 1225, 1227, 1350, 1410, 1422, 1427, 1431, 1450, 1452, 1468, 1470, 7, 5, 0, 0, 5, 1, 0, 5, 2, 0, 4, 0, 0, 6, 0, 0, 0, 1, 0, 7, 147, 0] \ No newline at end of file diff --git a/posthog/hogql/grammar/HogQLLexer.py b/posthog/hogql/grammar/HogQLLexer.py index f234dd38975d8..2fced647ff922 100644 --- a/posthog/hogql/grammar/HogQLLexer.py +++ b/posthog/hogql/grammar/HogQLLexer.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,0,160,1455,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4, + 4,0,162,1476,6,-1,6,-1,6,-1,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4, 7,4,2,5,7,5,2,6,7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11, 2,12,7,12,2,13,7,13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18, 7,18,2,19,7,19,2,20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24, @@ -42,548 +42,557 @@ def serializedATN(): 2,174,7,174,2,175,7,175,2,176,7,176,2,177,7,177,2,178,7,178,2,179, 7,179,2,180,7,180,2,181,7,181,2,182,7,182,2,183,7,183,2,184,7,184, 2,185,7,185,2,186,7,186,2,187,7,187,2,188,7,188,2,189,7,189,2,190, - 7,190,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1,2,1,2,1,2,1,2,1,2,1,3,1, - 3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1,5,1,5,1,6,1,6,1,6,1,6,1, - 6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3,6,426,8,6,1,7,1,7,1,7,1, - 7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,9,1,9,1,9,1,9,1,9,1,10,1, - 10,1,10,1,11,1,11,1,11,1,11,1,11,1,12,1,12,1,12,1,12,1,12,1,13,1, - 13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1,14,1,14,1,14,1,14,1,15,1, - 15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1,16,1,16,1,16,1,16,1,16,1, - 17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1,18,1, - 19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1,20,1,21,1,21,1,21,1,21,1, - 21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1,23,1, - 23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,24,1,24,1,24,1,24,1,24,1, - 25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,26,1,27,1, - 27,1,27,1,27,1,27,1,27,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1,28,1, - 29,1,29,1,29,1,29,1,29,1,29,1,30,1,30,1,30,1,31,1,31,1,31,1,31,1, - 31,1,31,1,31,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1, - 33,1,33,1,34,1,34,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1, - 36,1,36,1,36,1,36,1,37,1,37,1,37,1,37,1,37,1,37,1,37,1,38,1,38,1, - 38,1,38,1,38,1,39,1,39,1,39,1,40,1,40,1,40,1,41,1,41,1,41,1,41,1, - 41,1,41,1,42,1,42,1,42,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1,43,1, - 43,1,43,1,43,1,43,1,43,3,43,647,8,43,1,44,1,44,1,44,1,44,1,44,1, - 44,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,45,1,46,1,46,1,46,1, - 47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1, - 49,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1, - 51,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1, - 54,1,54,1,54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1, - 56,1,56,1,56,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,59,1,59,1, - 59,1,59,1,59,1,60,1,60,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,1,62,1,62,1,62,1,63,1,63,1,63,1,64,1,64,1,64,1,64,1, - 64,1,64,1,65,1,65,1,65,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1, - 67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,67,1,68,1,68,1,68,1, - 68,1,68,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1,69,1,69,1, - 69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1,71,1,71,1, - 71,1,71,1,71,1,71,1,72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1, - 73,1,73,1,73,1,73,1,74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1, - 75,1,75,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,77,1,77,1, - 77,1,78,1,78,1,78,1,78,1,78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1, - 79,1,79,1,80,1,80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1, - 81,1,81,1,81,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1,82,1, - 83,1,83,1,83,1,83,1,83,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1, - 85,1,85,1,85,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1,86,1, - 87,1,87,1,87,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,89,1,89,1,89,1, - 89,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,90,1,91,1,91,1,91,1, - 91,1,91,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1, - 93,1,93,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1, - 95,1,95,1,95,1,95,1,95,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1, - 97,1,97,1,97,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1, - 99,1,100,1,100,1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1, - 101,1,101,1,101,1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103, - 1,103,1,103,1,103,1,103,1,103,1,103,1,103,3,103,1021,8,103,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104,1,104, - 1,104,1,104,1,104,1,104,3,104,1050,8,104,1,105,1,105,1,105,3,105, - 1055,8,105,1,105,1,105,1,105,1,105,5,105,1061,8,105,10,105,12,105, - 1064,9,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105,1,105, - 5,105,1075,8,105,10,105,12,105,1078,9,105,1,105,1,105,1,105,1,105, - 1,105,1,105,1,105,1,105,1,105,1,105,1,105,5,105,1091,8,105,10,105, - 12,105,1094,9,105,1,105,1,105,3,105,1098,8,105,1,106,1,106,1,106, - 5,106,1103,8,106,10,106,12,106,1106,9,106,1,106,1,106,3,106,1110, - 8,106,1,106,1,106,3,106,1114,8,106,1,106,4,106,1117,8,106,11,106, - 12,106,1118,1,106,1,106,1,106,3,106,1124,8,106,1,106,1,106,3,106, - 1128,8,106,1,106,4,106,1131,8,106,11,106,12,106,1132,1,106,1,106, - 1,106,5,106,1138,8,106,10,106,12,106,1141,9,106,1,106,1,106,1,106, - 3,106,1146,8,106,1,106,4,106,1149,8,106,11,106,12,106,1150,1,106, - 1,106,1,106,1,106,1,106,3,106,1158,8,106,1,106,4,106,1161,8,106, - 11,106,12,106,1162,1,106,1,106,1,106,1,106,3,106,1169,8,106,1,106, - 4,106,1172,8,106,11,106,12,106,1173,3,106,1176,8,106,1,107,1,107, - 4,107,1180,8,107,11,107,12,107,1181,1,108,4,108,1185,8,108,11,108, - 12,108,1186,1,109,1,109,1,109,4,109,1192,8,109,11,109,12,109,1193, - 1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,1,110,5,110,1205, - 8,110,10,110,12,110,1208,9,110,1,110,1,110,1,111,1,111,1,112,1,112, - 1,113,1,113,1,114,1,114,1,115,1,115,1,116,1,116,1,117,1,117,1,118, - 1,118,1,119,1,119,1,120,1,120,1,121,1,121,1,122,1,122,1,123,1,123, - 1,124,1,124,1,125,1,125,1,126,1,126,1,127,1,127,1,128,1,128,1,129, - 1,129,1,130,1,130,1,131,1,131,1,132,1,132,1,133,1,133,1,134,1,134, - 1,135,1,135,1,136,1,136,1,137,1,137,1,138,1,138,1,139,1,139,1,140, - 1,140,1,141,1,141,1,141,1,142,1,142,1,143,1,143,1,144,1,144,1,145, - 1,145,1,146,1,146,1,147,1,147,1,147,1,148,1,148,1,149,1,149,1,150, - 1,150,1,151,1,151,1,151,1,152,1,152,1,153,1,153,1,153,1,154,1,154, - 1,155,1,155,1,156,1,156,1,156,1,157,1,157,1,157,1,157,1,158,1,158, - 1,158,1,158,1,159,1,159,1,160,1,160,1,161,1,161,1,161,1,162,1,162, - 1,163,1,163,1,163,1,163,3,163,1330,8,163,1,164,1,164,1,164,1,164, - 1,165,1,165,1,165,1,166,1,166,1,166,1,167,1,167,1,167,1,168,1,168, - 1,169,1,169,1,170,1,170,1,171,1,171,1,172,1,172,1,172,1,172,1,172, - 1,173,1,173,1,173,1,173,1,173,1,174,1,174,1,175,1,175,1,176,1,176, - 1,176,1,177,1,177,1,177,1,177,1,178,1,178,1,179,1,179,1,180,1,180, - 1,181,1,181,1,182,1,182,1,183,1,183,1,183,1,183,5,183,1388,8,183, - 10,183,12,183,1391,9,183,1,183,1,183,1,183,1,183,1,183,1,184,1,184, - 1,184,1,184,3,184,1402,8,184,1,184,5,184,1405,8,184,10,184,12,184, - 1408,9,184,1,184,3,184,1411,8,184,1,184,1,184,1,185,1,185,1,185, - 1,185,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186,1,186, - 1,186,4,186,1430,8,186,11,186,12,186,1431,1,187,1,187,1,187,1,187, - 1,188,1,188,1,188,1,188,1,188,1,189,1,189,1,189,1,189,1,189,4,189, - 1448,8,189,11,189,12,189,1449,1,190,1,190,1,190,1,190,1,1389,0,191, - 3,1,5,2,7,3,9,4,11,5,13,6,15,7,17,8,19,9,21,10,23,11,25,12,27,13, - 29,14,31,15,33,16,35,17,37,18,39,19,41,20,43,21,45,22,47,23,49,24, - 51,25,53,26,55,27,57,28,59,29,61,30,63,31,65,32,67,33,69,34,71,35, - 73,36,75,37,77,38,79,39,81,40,83,41,85,42,87,43,89,44,91,45,93,46, - 95,47,97,48,99,49,101,50,103,51,105,52,107,53,109,54,111,55,113, - 56,115,57,117,58,119,59,121,60,123,61,125,62,127,63,129,64,131,65, - 133,66,135,67,137,68,139,69,141,70,143,71,145,72,147,73,149,74,151, - 75,153,76,155,77,157,78,159,79,161,80,163,81,165,82,167,83,169,84, - 171,85,173,86,175,87,177,88,179,89,181,90,183,91,185,92,187,93,189, - 94,191,95,193,96,195,97,197,98,199,99,201,100,203,101,205,102,207, - 103,209,104,211,105,213,106,215,107,217,108,219,109,221,110,223, - 111,225,0,227,0,229,0,231,0,233,0,235,0,237,0,239,0,241,0,243,0, - 245,0,247,0,249,0,251,0,253,0,255,0,257,0,259,0,261,0,263,0,265, - 0,267,0,269,0,271,0,273,0,275,0,277,0,279,0,281,0,283,0,285,112, - 287,113,289,114,291,115,293,116,295,117,297,118,299,119,301,120, - 303,121,305,122,307,123,309,124,311,125,313,126,315,127,317,128, - 319,129,321,130,323,131,325,132,327,133,329,134,331,135,333,136, - 335,137,337,138,339,139,341,140,343,141,345,142,347,143,349,144, - 351,145,353,146,355,147,357,148,359,149,361,150,363,151,365,152, - 367,153,369,154,371,155,373,156,375,157,377,158,379,0,381,159,383, - 160,3,0,1,2,38,2,0,92,92,96,96,2,0,34,34,92,92,2,0,39,39,92,92,2, - 0,65,65,97,97,2,0,66,66,98,98,2,0,67,67,99,99,2,0,68,68,100,100, - 2,0,69,69,101,101,2,0,70,70,102,102,2,0,71,71,103,103,2,0,72,72, - 104,104,2,0,73,73,105,105,2,0,74,74,106,106,2,0,75,75,107,107,2, - 0,76,76,108,108,2,0,77,77,109,109,2,0,78,78,110,110,2,0,79,79,111, - 111,2,0,80,80,112,112,2,0,81,81,113,113,2,0,82,82,114,114,2,0,83, - 83,115,115,2,0,84,84,116,116,2,0,85,85,117,117,2,0,86,86,118,118, - 2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121,2,0,90,90, - 122,122,2,0,65,90,97,122,1,0,48,55,1,0,48,57,3,0,48,57,65,70,97, - 102,2,0,10,10,13,13,2,1,10,10,13,13,2,0,9,13,32,32,3,0,39,39,92, - 92,123,123,1,0,123,123,1491,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0,0, - 0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0,0, - 0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0,0, - 0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0,0, - 0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0,0, - 0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0,0, - 0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0,0, - 0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0,0, - 0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0,0, - 0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0,0, - 0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1,0, - 0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0,117, - 1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0,0,0, - 0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135,1, - 0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0,0, - 145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1,0, - 0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0,163, - 1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0,0,0, - 0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181,1, - 0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0,0, - 191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1,0, - 0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0,209, - 1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0,0,0, - 0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,285,1,0,0,0,0,287,1, - 0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0,0, - 297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1,0, - 0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0,315, - 1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0,0,0, - 0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0,0,0,0,333,1, - 0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0,0, - 343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1,0, - 0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0,361, - 1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0,0,0, - 0,371,1,0,0,0,0,373,1,0,0,0,1,375,1,0,0,0,1,377,1,0,0,0,1,379,1, - 0,0,0,2,381,1,0,0,0,2,383,1,0,0,0,3,385,1,0,0,0,5,389,1,0,0,0,7, - 393,1,0,0,0,9,398,1,0,0,0,11,402,1,0,0,0,13,408,1,0,0,0,15,425,1, - 0,0,0,17,427,1,0,0,0,19,432,1,0,0,0,21,440,1,0,0,0,23,445,1,0,0, - 0,25,448,1,0,0,0,27,453,1,0,0,0,29,458,1,0,0,0,31,464,1,0,0,0,33, - 471,1,0,0,0,35,479,1,0,0,0,37,485,1,0,0,0,39,490,1,0,0,0,41,498, - 1,0,0,0,43,503,1,0,0,0,45,507,1,0,0,0,47,512,1,0,0,0,49,523,1,0, - 0,0,51,532,1,0,0,0,53,537,1,0,0,0,55,541,1,0,0,0,57,549,1,0,0,0, - 59,555,1,0,0,0,61,563,1,0,0,0,63,569,1,0,0,0,65,572,1,0,0,0,67,582, - 1,0,0,0,69,586,1,0,0,0,71,591,1,0,0,0,73,596,1,0,0,0,75,600,1,0, - 0,0,77,606,1,0,0,0,79,613,1,0,0,0,81,618,1,0,0,0,83,621,1,0,0,0, - 85,624,1,0,0,0,87,630,1,0,0,0,89,646,1,0,0,0,91,648,1,0,0,0,93,654, - 1,0,0,0,95,663,1,0,0,0,97,666,1,0,0,0,99,671,1,0,0,0,101,675,1,0, - 0,0,103,680,1,0,0,0,105,688,1,0,0,0,107,693,1,0,0,0,109,697,1,0, - 0,0,111,702,1,0,0,0,113,708,1,0,0,0,115,715,1,0,0,0,117,721,1,0, - 0,0,119,725,1,0,0,0,121,729,1,0,0,0,123,734,1,0,0,0,125,740,1,0, - 0,0,127,747,1,0,0,0,129,750,1,0,0,0,131,753,1,0,0,0,133,759,1,0, - 0,0,135,765,1,0,0,0,137,770,1,0,0,0,139,780,1,0,0,0,141,790,1,0, - 0,0,143,799,1,0,0,0,145,807,1,0,0,0,147,813,1,0,0,0,149,820,1,0, - 0,0,151,826,1,0,0,0,153,833,1,0,0,0,155,837,1,0,0,0,157,842,1,0, - 0,0,159,849,1,0,0,0,161,856,1,0,0,0,163,863,1,0,0,0,165,868,1,0, - 0,0,167,877,1,0,0,0,169,887,1,0,0,0,171,892,1,0,0,0,173,898,1,0, - 0,0,175,903,1,0,0,0,177,913,1,0,0,0,179,916,1,0,0,0,181,920,1,0, - 0,0,183,927,1,0,0,0,185,936,1,0,0,0,187,941,1,0,0,0,189,950,1,0, - 0,0,191,954,1,0,0,0,193,964,1,0,0,0,195,970,1,0,0,0,197,976,1,0, - 0,0,199,981,1,0,0,0,201,986,1,0,0,0,203,992,1,0,0,0,205,998,1,0, - 0,0,207,1005,1,0,0,0,209,1020,1,0,0,0,211,1049,1,0,0,0,213,1097, - 1,0,0,0,215,1175,1,0,0,0,217,1177,1,0,0,0,219,1184,1,0,0,0,221,1188, - 1,0,0,0,223,1195,1,0,0,0,225,1211,1,0,0,0,227,1213,1,0,0,0,229,1215, - 1,0,0,0,231,1217,1,0,0,0,233,1219,1,0,0,0,235,1221,1,0,0,0,237,1223, - 1,0,0,0,239,1225,1,0,0,0,241,1227,1,0,0,0,243,1229,1,0,0,0,245,1231, - 1,0,0,0,247,1233,1,0,0,0,249,1235,1,0,0,0,251,1237,1,0,0,0,253,1239, - 1,0,0,0,255,1241,1,0,0,0,257,1243,1,0,0,0,259,1245,1,0,0,0,261,1247, - 1,0,0,0,263,1249,1,0,0,0,265,1251,1,0,0,0,267,1253,1,0,0,0,269,1255, - 1,0,0,0,271,1257,1,0,0,0,273,1259,1,0,0,0,275,1261,1,0,0,0,277,1263, - 1,0,0,0,279,1265,1,0,0,0,281,1267,1,0,0,0,283,1269,1,0,0,0,285,1271, - 1,0,0,0,287,1274,1,0,0,0,289,1276,1,0,0,0,291,1278,1,0,0,0,293,1280, - 1,0,0,0,295,1282,1,0,0,0,297,1284,1,0,0,0,299,1287,1,0,0,0,301,1289, - 1,0,0,0,303,1291,1,0,0,0,305,1293,1,0,0,0,307,1296,1,0,0,0,309,1298, - 1,0,0,0,311,1301,1,0,0,0,313,1303,1,0,0,0,315,1305,1,0,0,0,317,1308, - 1,0,0,0,319,1312,1,0,0,0,321,1316,1,0,0,0,323,1318,1,0,0,0,325,1320, - 1,0,0,0,327,1323,1,0,0,0,329,1329,1,0,0,0,331,1331,1,0,0,0,333,1335, - 1,0,0,0,335,1338,1,0,0,0,337,1341,1,0,0,0,339,1344,1,0,0,0,341,1346, - 1,0,0,0,343,1348,1,0,0,0,345,1350,1,0,0,0,347,1352,1,0,0,0,349,1357, - 1,0,0,0,351,1362,1,0,0,0,353,1364,1,0,0,0,355,1366,1,0,0,0,357,1369, - 1,0,0,0,359,1373,1,0,0,0,361,1375,1,0,0,0,363,1377,1,0,0,0,365,1379, - 1,0,0,0,367,1381,1,0,0,0,369,1383,1,0,0,0,371,1401,1,0,0,0,373,1414, - 1,0,0,0,375,1429,1,0,0,0,377,1433,1,0,0,0,379,1437,1,0,0,0,381,1447, - 1,0,0,0,383,1451,1,0,0,0,385,386,3,225,111,0,386,387,3,247,122,0, - 387,388,3,247,122,0,388,4,1,0,0,0,389,390,3,225,111,0,390,391,3, - 251,124,0,391,392,3,231,114,0,392,6,1,0,0,0,393,394,3,225,111,0, - 394,395,3,251,124,0,395,396,3,263,130,0,396,397,3,241,119,0,397, - 8,1,0,0,0,398,399,3,225,111,0,399,400,3,251,124,0,400,401,3,273, - 135,0,401,10,1,0,0,0,402,403,3,225,111,0,403,404,3,259,128,0,404, - 405,3,259,128,0,405,406,3,225,111,0,406,407,3,273,135,0,407,12,1, - 0,0,0,408,409,3,225,111,0,409,410,3,261,129,0,410,14,1,0,0,0,411, - 412,3,225,111,0,412,413,3,261,129,0,413,414,3,229,113,0,414,426, - 1,0,0,0,415,416,3,225,111,0,416,417,3,261,129,0,417,418,3,229,113, - 0,418,419,3,233,115,0,419,420,3,251,124,0,420,421,3,231,114,0,421, - 422,3,241,119,0,422,423,3,251,124,0,423,424,3,237,117,0,424,426, - 1,0,0,0,425,411,1,0,0,0,425,415,1,0,0,0,426,16,1,0,0,0,427,428,3, - 225,111,0,428,429,3,261,129,0,429,430,3,253,125,0,430,431,3,235, - 116,0,431,18,1,0,0,0,432,433,3,227,112,0,433,434,3,233,115,0,434, - 435,3,263,130,0,435,436,3,269,133,0,436,437,3,233,115,0,437,438, - 3,233,115,0,438,439,3,251,124,0,439,20,1,0,0,0,440,441,3,227,112, - 0,441,442,3,253,125,0,442,443,3,263,130,0,443,444,3,239,118,0,444, - 22,1,0,0,0,445,446,3,227,112,0,446,447,3,273,135,0,447,24,1,0,0, - 0,448,449,3,229,113,0,449,450,3,225,111,0,450,451,3,261,129,0,451, - 452,3,233,115,0,452,26,1,0,0,0,453,454,3,229,113,0,454,455,3,225, - 111,0,455,456,3,261,129,0,456,457,3,263,130,0,457,28,1,0,0,0,458, - 459,3,229,113,0,459,460,3,225,111,0,460,461,3,263,130,0,461,462, - 3,229,113,0,462,463,3,239,118,0,463,30,1,0,0,0,464,465,3,229,113, - 0,465,466,3,253,125,0,466,467,3,239,118,0,467,468,3,253,125,0,468, - 469,3,259,128,0,469,470,3,263,130,0,470,32,1,0,0,0,471,472,3,229, - 113,0,472,473,3,253,125,0,473,474,3,247,122,0,474,475,3,247,122, - 0,475,476,3,225,111,0,476,477,3,263,130,0,477,478,3,233,115,0,478, - 34,1,0,0,0,479,480,3,229,113,0,480,481,3,259,128,0,481,482,3,253, - 125,0,482,483,3,261,129,0,483,484,3,261,129,0,484,36,1,0,0,0,485, - 486,3,229,113,0,486,487,3,265,131,0,487,488,3,227,112,0,488,489, - 3,233,115,0,489,38,1,0,0,0,490,491,3,229,113,0,491,492,3,265,131, - 0,492,493,3,259,128,0,493,494,3,259,128,0,494,495,3,233,115,0,495, - 496,3,251,124,0,496,497,3,263,130,0,497,40,1,0,0,0,498,499,3,231, - 114,0,499,500,3,225,111,0,500,501,3,263,130,0,501,502,3,233,115, - 0,502,42,1,0,0,0,503,504,3,231,114,0,504,505,3,225,111,0,505,506, - 3,273,135,0,506,44,1,0,0,0,507,508,3,231,114,0,508,509,3,233,115, - 0,509,510,3,261,129,0,510,511,3,229,113,0,511,46,1,0,0,0,512,513, - 3,231,114,0,513,514,3,233,115,0,514,515,3,261,129,0,515,516,3,229, - 113,0,516,517,3,233,115,0,517,518,3,251,124,0,518,519,3,231,114, - 0,519,520,3,241,119,0,520,521,3,251,124,0,521,522,3,237,117,0,522, - 48,1,0,0,0,523,524,3,231,114,0,524,525,3,241,119,0,525,526,3,261, - 129,0,526,527,3,263,130,0,527,528,3,241,119,0,528,529,3,251,124, - 0,529,530,3,229,113,0,530,531,3,263,130,0,531,50,1,0,0,0,532,533, - 3,233,115,0,533,534,3,247,122,0,534,535,3,261,129,0,535,536,3,233, - 115,0,536,52,1,0,0,0,537,538,3,233,115,0,538,539,3,251,124,0,539, - 540,3,231,114,0,540,54,1,0,0,0,541,542,3,233,115,0,542,543,3,271, - 134,0,543,544,3,263,130,0,544,545,3,259,128,0,545,546,3,225,111, - 0,546,547,3,229,113,0,547,548,3,263,130,0,548,56,1,0,0,0,549,550, - 3,235,116,0,550,551,3,241,119,0,551,552,3,251,124,0,552,553,3,225, - 111,0,553,554,3,247,122,0,554,58,1,0,0,0,555,556,3,235,116,0,556, - 557,3,241,119,0,557,558,3,251,124,0,558,559,3,225,111,0,559,560, - 3,247,122,0,560,561,3,247,122,0,561,562,3,273,135,0,562,60,1,0,0, - 0,563,564,3,235,116,0,564,565,3,241,119,0,565,566,3,259,128,0,566, - 567,3,261,129,0,567,568,3,263,130,0,568,62,1,0,0,0,569,570,3,235, - 116,0,570,571,3,251,124,0,571,64,1,0,0,0,572,573,3,235,116,0,573, - 574,3,253,125,0,574,575,3,247,122,0,575,576,3,247,122,0,576,577, - 3,253,125,0,577,578,3,269,133,0,578,579,3,241,119,0,579,580,3,251, - 124,0,580,581,3,237,117,0,581,66,1,0,0,0,582,583,3,235,116,0,583, - 584,3,253,125,0,584,585,3,259,128,0,585,68,1,0,0,0,586,587,3,235, - 116,0,587,588,3,259,128,0,588,589,3,253,125,0,589,590,3,249,123, - 0,590,70,1,0,0,0,591,592,3,235,116,0,592,593,3,265,131,0,593,594, - 3,247,122,0,594,595,3,247,122,0,595,72,1,0,0,0,596,597,3,235,116, - 0,597,598,3,265,131,0,598,599,3,251,124,0,599,74,1,0,0,0,600,601, - 3,237,117,0,601,602,3,259,128,0,602,603,3,253,125,0,603,604,3,265, - 131,0,604,605,3,255,126,0,605,76,1,0,0,0,606,607,3,239,118,0,607, - 608,3,225,111,0,608,609,3,267,132,0,609,610,3,241,119,0,610,611, - 3,251,124,0,611,612,3,237,117,0,612,78,1,0,0,0,613,614,3,239,118, - 0,614,615,3,253,125,0,615,616,3,265,131,0,616,617,3,259,128,0,617, - 80,1,0,0,0,618,619,3,241,119,0,619,620,3,231,114,0,620,82,1,0,0, - 0,621,622,3,241,119,0,622,623,3,235,116,0,623,84,1,0,0,0,624,625, - 3,241,119,0,625,626,3,247,122,0,626,627,3,241,119,0,627,628,3,245, - 121,0,628,629,3,233,115,0,629,86,1,0,0,0,630,631,3,241,119,0,631, - 632,3,251,124,0,632,88,1,0,0,0,633,634,3,241,119,0,634,635,3,251, - 124,0,635,636,3,235,116,0,636,647,1,0,0,0,637,638,3,241,119,0,638, - 639,3,251,124,0,639,640,3,235,116,0,640,641,3,241,119,0,641,642, - 3,251,124,0,642,643,3,241,119,0,643,644,3,263,130,0,644,645,3,273, - 135,0,645,647,1,0,0,0,646,633,1,0,0,0,646,637,1,0,0,0,647,90,1,0, - 0,0,648,649,3,241,119,0,649,650,3,251,124,0,650,651,3,251,124,0, - 651,652,3,233,115,0,652,653,3,259,128,0,653,92,1,0,0,0,654,655,3, - 241,119,0,655,656,3,251,124,0,656,657,3,263,130,0,657,658,3,233, - 115,0,658,659,3,259,128,0,659,660,3,267,132,0,660,661,3,225,111, - 0,661,662,3,247,122,0,662,94,1,0,0,0,663,664,3,241,119,0,664,665, - 3,261,129,0,665,96,1,0,0,0,666,667,3,243,120,0,667,668,3,253,125, - 0,668,669,3,241,119,0,669,670,3,251,124,0,670,98,1,0,0,0,671,672, - 3,245,121,0,672,673,3,233,115,0,673,674,3,273,135,0,674,100,1,0, - 0,0,675,676,3,247,122,0,676,677,3,225,111,0,677,678,3,261,129,0, - 678,679,3,263,130,0,679,102,1,0,0,0,680,681,3,247,122,0,681,682, - 3,233,115,0,682,683,3,225,111,0,683,684,3,231,114,0,684,685,3,241, - 119,0,685,686,3,251,124,0,686,687,3,237,117,0,687,104,1,0,0,0,688, - 689,3,247,122,0,689,690,3,233,115,0,690,691,3,235,116,0,691,692, - 3,263,130,0,692,106,1,0,0,0,693,694,3,247,122,0,694,695,3,233,115, - 0,695,696,3,263,130,0,696,108,1,0,0,0,697,698,3,247,122,0,698,699, - 3,241,119,0,699,700,3,245,121,0,700,701,3,233,115,0,701,110,1,0, - 0,0,702,703,3,247,122,0,703,704,3,241,119,0,704,705,3,249,123,0, - 705,706,3,241,119,0,706,707,3,263,130,0,707,112,1,0,0,0,708,709, - 3,249,123,0,709,710,3,241,119,0,710,711,3,251,124,0,711,712,3,265, - 131,0,712,713,3,263,130,0,713,714,3,233,115,0,714,114,1,0,0,0,715, - 716,3,249,123,0,716,717,3,253,125,0,717,718,3,251,124,0,718,719, - 3,263,130,0,719,720,3,239,118,0,720,116,1,0,0,0,721,722,3,251,124, - 0,722,723,3,225,111,0,723,724,3,251,124,0,724,118,1,0,0,0,725,726, - 3,251,124,0,726,727,3,253,125,0,727,728,3,263,130,0,728,120,1,0, - 0,0,729,730,3,251,124,0,730,731,3,265,131,0,731,732,3,247,122,0, - 732,733,3,247,122,0,733,122,1,0,0,0,734,735,3,251,124,0,735,736, - 3,265,131,0,736,737,3,247,122,0,737,738,3,247,122,0,738,739,3,261, - 129,0,739,124,1,0,0,0,740,741,3,253,125,0,741,742,3,235,116,0,742, - 743,3,235,116,0,743,744,3,261,129,0,744,745,3,233,115,0,745,746, - 3,263,130,0,746,126,1,0,0,0,747,748,3,253,125,0,748,749,3,251,124, - 0,749,128,1,0,0,0,750,751,3,253,125,0,751,752,3,259,128,0,752,130, - 1,0,0,0,753,754,3,253,125,0,754,755,3,259,128,0,755,756,3,231,114, - 0,756,757,3,233,115,0,757,758,3,259,128,0,758,132,1,0,0,0,759,760, - 3,253,125,0,760,761,3,265,131,0,761,762,3,263,130,0,762,763,3,233, - 115,0,763,764,3,259,128,0,764,134,1,0,0,0,765,766,3,253,125,0,766, - 767,3,267,132,0,767,768,3,233,115,0,768,769,3,259,128,0,769,136, - 1,0,0,0,770,771,3,255,126,0,771,772,3,225,111,0,772,773,3,259,128, - 0,773,774,3,263,130,0,774,775,3,241,119,0,775,776,3,263,130,0,776, - 777,3,241,119,0,777,778,3,253,125,0,778,779,3,251,124,0,779,138, - 1,0,0,0,780,781,3,255,126,0,781,782,3,259,128,0,782,783,3,233,115, - 0,783,784,3,229,113,0,784,785,3,233,115,0,785,786,3,231,114,0,786, - 787,3,241,119,0,787,788,3,251,124,0,788,789,3,237,117,0,789,140, - 1,0,0,0,790,791,3,255,126,0,791,792,3,259,128,0,792,793,3,233,115, - 0,793,794,3,269,133,0,794,795,3,239,118,0,795,796,3,233,115,0,796, - 797,3,259,128,0,797,798,3,233,115,0,798,142,1,0,0,0,799,800,3,257, - 127,0,800,801,3,265,131,0,801,802,3,225,111,0,802,803,3,259,128, - 0,803,804,3,263,130,0,804,805,3,233,115,0,805,806,3,259,128,0,806, - 144,1,0,0,0,807,808,3,259,128,0,808,809,3,225,111,0,809,810,3,251, - 124,0,810,811,3,237,117,0,811,812,3,233,115,0,812,146,1,0,0,0,813, - 814,3,259,128,0,814,815,3,233,115,0,815,816,3,263,130,0,816,817, - 3,265,131,0,817,818,3,259,128,0,818,819,3,251,124,0,819,148,1,0, - 0,0,820,821,3,259,128,0,821,822,3,241,119,0,822,823,3,237,117,0, - 823,824,3,239,118,0,824,825,3,263,130,0,825,150,1,0,0,0,826,827, - 3,259,128,0,827,828,3,253,125,0,828,829,3,247,122,0,829,830,3,247, - 122,0,830,831,3,265,131,0,831,832,3,255,126,0,832,152,1,0,0,0,833, - 834,3,259,128,0,834,835,3,253,125,0,835,836,3,269,133,0,836,154, - 1,0,0,0,837,838,3,259,128,0,838,839,3,253,125,0,839,840,3,269,133, - 0,840,841,3,261,129,0,841,156,1,0,0,0,842,843,3,261,129,0,843,844, - 3,225,111,0,844,845,3,249,123,0,845,846,3,255,126,0,846,847,3,247, - 122,0,847,848,3,233,115,0,848,158,1,0,0,0,849,850,3,261,129,0,850, - 851,3,233,115,0,851,852,3,229,113,0,852,853,3,253,125,0,853,854, - 3,251,124,0,854,855,3,231,114,0,855,160,1,0,0,0,856,857,3,261,129, - 0,857,858,3,233,115,0,858,859,3,247,122,0,859,860,3,233,115,0,860, - 861,3,229,113,0,861,862,3,263,130,0,862,162,1,0,0,0,863,864,3,261, - 129,0,864,865,3,233,115,0,865,866,3,249,123,0,866,867,3,241,119, - 0,867,164,1,0,0,0,868,869,3,261,129,0,869,870,3,233,115,0,870,871, - 3,263,130,0,871,872,3,263,130,0,872,873,3,241,119,0,873,874,3,251, - 124,0,874,875,3,237,117,0,875,876,3,261,129,0,876,166,1,0,0,0,877, - 878,3,261,129,0,878,879,3,265,131,0,879,880,3,227,112,0,880,881, - 3,261,129,0,881,882,3,263,130,0,882,883,3,259,128,0,883,884,3,241, - 119,0,884,885,3,251,124,0,885,886,3,237,117,0,886,168,1,0,0,0,887, - 888,3,263,130,0,888,889,3,239,118,0,889,890,3,233,115,0,890,891, - 3,251,124,0,891,170,1,0,0,0,892,893,3,263,130,0,893,894,3,239,118, - 0,894,895,3,259,128,0,895,896,3,253,125,0,896,897,3,269,133,0,897, - 172,1,0,0,0,898,899,3,263,130,0,899,900,3,241,119,0,900,901,3,233, - 115,0,901,902,3,261,129,0,902,174,1,0,0,0,903,904,3,263,130,0,904, - 905,3,241,119,0,905,906,3,249,123,0,906,907,3,233,115,0,907,908, - 3,261,129,0,908,909,3,263,130,0,909,910,3,225,111,0,910,911,3,249, - 123,0,911,912,3,255,126,0,912,176,1,0,0,0,913,914,3,263,130,0,914, - 915,3,253,125,0,915,178,1,0,0,0,916,917,3,263,130,0,917,918,3,253, - 125,0,918,919,3,255,126,0,919,180,1,0,0,0,920,921,3,263,130,0,921, - 922,3,253,125,0,922,923,3,263,130,0,923,924,3,225,111,0,924,925, - 3,247,122,0,925,926,3,261,129,0,926,182,1,0,0,0,927,928,3,263,130, - 0,928,929,3,259,128,0,929,930,3,225,111,0,930,931,3,241,119,0,931, - 932,3,247,122,0,932,933,3,241,119,0,933,934,3,251,124,0,934,935, - 3,237,117,0,935,184,1,0,0,0,936,937,3,263,130,0,937,938,3,259,128, - 0,938,939,3,241,119,0,939,940,3,249,123,0,940,186,1,0,0,0,941,942, - 3,263,130,0,942,943,3,259,128,0,943,944,3,265,131,0,944,945,3,251, - 124,0,945,946,3,229,113,0,946,947,3,225,111,0,947,948,3,263,130, - 0,948,949,3,233,115,0,949,188,1,0,0,0,950,951,3,263,130,0,951,952, - 3,259,128,0,952,953,3,273,135,0,953,190,1,0,0,0,954,955,3,265,131, - 0,955,956,3,251,124,0,956,957,3,227,112,0,957,958,3,253,125,0,958, - 959,3,265,131,0,959,960,3,251,124,0,960,961,3,231,114,0,961,962, - 3,233,115,0,962,963,3,231,114,0,963,192,1,0,0,0,964,965,3,265,131, - 0,965,966,3,251,124,0,966,967,3,241,119,0,967,968,3,253,125,0,968, - 969,3,251,124,0,969,194,1,0,0,0,970,971,3,265,131,0,971,972,3,261, - 129,0,972,973,3,241,119,0,973,974,3,251,124,0,974,975,3,237,117, - 0,975,196,1,0,0,0,976,977,3,269,133,0,977,978,3,233,115,0,978,979, - 3,233,115,0,979,980,3,245,121,0,980,198,1,0,0,0,981,982,3,269,133, - 0,982,983,3,239,118,0,983,984,3,233,115,0,984,985,3,251,124,0,985, - 200,1,0,0,0,986,987,3,269,133,0,987,988,3,239,118,0,988,989,3,233, - 115,0,989,990,3,259,128,0,990,991,3,233,115,0,991,202,1,0,0,0,992, - 993,3,269,133,0,993,994,3,239,118,0,994,995,3,241,119,0,995,996, - 3,247,122,0,996,997,3,233,115,0,997,204,1,0,0,0,998,999,3,269,133, - 0,999,1000,3,241,119,0,1000,1001,3,251,124,0,1001,1002,3,231,114, - 0,1002,1003,3,253,125,0,1003,1004,3,269,133,0,1004,206,1,0,0,0,1005, - 1006,3,269,133,0,1006,1007,3,241,119,0,1007,1008,3,263,130,0,1008, - 1009,3,239,118,0,1009,208,1,0,0,0,1010,1011,3,273,135,0,1011,1012, - 3,233,115,0,1012,1013,3,225,111,0,1013,1014,3,259,128,0,1014,1021, - 1,0,0,0,1015,1016,3,273,135,0,1016,1017,3,273,135,0,1017,1018,3, - 273,135,0,1018,1019,3,273,135,0,1019,1021,1,0,0,0,1020,1010,1,0, - 0,0,1020,1015,1,0,0,0,1021,210,1,0,0,0,1022,1023,3,291,144,0,1023, - 1024,3,227,112,0,1024,1050,1,0,0,0,1025,1026,3,291,144,0,1026,1027, - 3,235,116,0,1027,1050,1,0,0,0,1028,1029,3,291,144,0,1029,1030,3, - 259,128,0,1030,1050,1,0,0,0,1031,1032,3,291,144,0,1032,1033,3,251, - 124,0,1033,1050,1,0,0,0,1034,1035,3,291,144,0,1035,1036,3,263,130, - 0,1036,1050,1,0,0,0,1037,1038,3,291,144,0,1038,1039,5,48,0,0,1039, - 1050,1,0,0,0,1040,1041,3,291,144,0,1041,1042,3,225,111,0,1042,1050, - 1,0,0,0,1043,1044,3,291,144,0,1044,1045,3,267,132,0,1045,1050,1, - 0,0,0,1046,1047,3,291,144,0,1047,1048,3,291,144,0,1048,1050,1,0, - 0,0,1049,1022,1,0,0,0,1049,1025,1,0,0,0,1049,1028,1,0,0,0,1049,1031, - 1,0,0,0,1049,1034,1,0,0,0,1049,1037,1,0,0,0,1049,1040,1,0,0,0,1049, - 1043,1,0,0,0,1049,1046,1,0,0,0,1050,212,1,0,0,0,1051,1055,3,277, - 137,0,1052,1055,3,367,182,0,1053,1055,3,301,149,0,1054,1051,1,0, - 0,0,1054,1052,1,0,0,0,1054,1053,1,0,0,0,1055,1062,1,0,0,0,1056,1061, - 3,277,137,0,1057,1061,3,367,182,0,1058,1061,3,281,139,0,1059,1061, - 3,301,149,0,1060,1056,1,0,0,0,1060,1057,1,0,0,0,1060,1058,1,0,0, - 0,1060,1059,1,0,0,0,1061,1064,1,0,0,0,1062,1060,1,0,0,0,1062,1063, - 1,0,0,0,1063,1098,1,0,0,0,1064,1062,1,0,0,0,1065,1076,3,289,143, - 0,1066,1075,8,0,0,0,1067,1075,3,211,104,0,1068,1069,3,291,144,0, - 1069,1070,3,351,174,0,1070,1075,1,0,0,0,1071,1072,3,289,143,0,1072, - 1073,3,289,143,0,1073,1075,1,0,0,0,1074,1066,1,0,0,0,1074,1067,1, - 0,0,0,1074,1068,1,0,0,0,1074,1071,1,0,0,0,1075,1078,1,0,0,0,1076, - 1074,1,0,0,0,1076,1077,1,0,0,0,1077,1079,1,0,0,0,1078,1076,1,0,0, - 0,1079,1080,3,289,143,0,1080,1098,1,0,0,0,1081,1092,3,345,171,0, - 1082,1091,8,1,0,0,1083,1091,3,211,104,0,1084,1085,3,291,144,0,1085, - 1086,3,345,171,0,1086,1091,1,0,0,0,1087,1088,3,345,171,0,1088,1089, - 3,345,171,0,1089,1091,1,0,0,0,1090,1082,1,0,0,0,1090,1083,1,0,0, - 0,1090,1084,1,0,0,0,1090,1087,1,0,0,0,1091,1094,1,0,0,0,1092,1090, - 1,0,0,0,1092,1093,1,0,0,0,1093,1095,1,0,0,0,1094,1092,1,0,0,0,1095, - 1096,3,345,171,0,1096,1098,1,0,0,0,1097,1054,1,0,0,0,1097,1065,1, - 0,0,0,1097,1081,1,0,0,0,1098,214,1,0,0,0,1099,1100,3,221,109,0,1100, - 1104,3,303,150,0,1101,1103,3,283,140,0,1102,1101,1,0,0,0,1103,1106, - 1,0,0,0,1104,1102,1,0,0,0,1104,1105,1,0,0,0,1105,1109,1,0,0,0,1106, - 1104,1,0,0,0,1107,1110,3,255,126,0,1108,1110,3,233,115,0,1109,1107, - 1,0,0,0,1109,1108,1,0,0,0,1110,1113,1,0,0,0,1111,1114,3,341,169, - 0,1112,1114,3,299,148,0,1113,1111,1,0,0,0,1113,1112,1,0,0,0,1113, - 1114,1,0,0,0,1114,1116,1,0,0,0,1115,1117,3,281,139,0,1116,1115,1, - 0,0,0,1117,1118,1,0,0,0,1118,1116,1,0,0,0,1118,1119,1,0,0,0,1119, - 1176,1,0,0,0,1120,1123,3,221,109,0,1121,1124,3,255,126,0,1122,1124, - 3,233,115,0,1123,1121,1,0,0,0,1123,1122,1,0,0,0,1124,1127,1,0,0, - 0,1125,1128,3,341,169,0,1126,1128,3,299,148,0,1127,1125,1,0,0,0, - 1127,1126,1,0,0,0,1127,1128,1,0,0,0,1128,1130,1,0,0,0,1129,1131, - 3,281,139,0,1130,1129,1,0,0,0,1131,1132,1,0,0,0,1132,1130,1,0,0, - 0,1132,1133,1,0,0,0,1133,1176,1,0,0,0,1134,1135,3,219,108,0,1135, - 1139,3,303,150,0,1136,1138,3,281,139,0,1137,1136,1,0,0,0,1138,1141, - 1,0,0,0,1139,1137,1,0,0,0,1139,1140,1,0,0,0,1140,1142,1,0,0,0,1141, - 1139,1,0,0,0,1142,1145,3,233,115,0,1143,1146,3,341,169,0,1144,1146, - 3,299,148,0,1145,1143,1,0,0,0,1145,1144,1,0,0,0,1145,1146,1,0,0, - 0,1146,1148,1,0,0,0,1147,1149,3,281,139,0,1148,1147,1,0,0,0,1149, - 1150,1,0,0,0,1150,1148,1,0,0,0,1150,1151,1,0,0,0,1151,1176,1,0,0, - 0,1152,1153,3,303,150,0,1153,1154,3,219,108,0,1154,1157,3,233,115, - 0,1155,1158,3,341,169,0,1156,1158,3,299,148,0,1157,1155,1,0,0,0, - 1157,1156,1,0,0,0,1157,1158,1,0,0,0,1158,1160,1,0,0,0,1159,1161, - 3,281,139,0,1160,1159,1,0,0,0,1161,1162,1,0,0,0,1162,1160,1,0,0, - 0,1162,1163,1,0,0,0,1163,1176,1,0,0,0,1164,1165,3,219,108,0,1165, - 1168,3,233,115,0,1166,1169,3,341,169,0,1167,1169,3,299,148,0,1168, - 1166,1,0,0,0,1168,1167,1,0,0,0,1168,1169,1,0,0,0,1169,1171,1,0,0, - 0,1170,1172,3,281,139,0,1171,1170,1,0,0,0,1172,1173,1,0,0,0,1173, - 1171,1,0,0,0,1173,1174,1,0,0,0,1174,1176,1,0,0,0,1175,1099,1,0,0, - 0,1175,1120,1,0,0,0,1175,1134,1,0,0,0,1175,1152,1,0,0,0,1175,1164, - 1,0,0,0,1176,216,1,0,0,0,1177,1179,5,48,0,0,1178,1180,3,279,138, - 0,1179,1178,1,0,0,0,1180,1181,1,0,0,0,1181,1179,1,0,0,0,1181,1182, - 1,0,0,0,1182,218,1,0,0,0,1183,1185,3,281,139,0,1184,1183,1,0,0,0, - 1185,1186,1,0,0,0,1186,1184,1,0,0,0,1186,1187,1,0,0,0,1187,220,1, - 0,0,0,1188,1189,5,48,0,0,1189,1191,3,271,134,0,1190,1192,3,283,140, - 0,1191,1190,1,0,0,0,1192,1193,1,0,0,0,1193,1191,1,0,0,0,1193,1194, - 1,0,0,0,1194,222,1,0,0,0,1195,1206,3,351,174,0,1196,1205,8,2,0,0, - 1197,1205,3,211,104,0,1198,1199,3,291,144,0,1199,1200,3,351,174, - 0,1200,1205,1,0,0,0,1201,1202,3,351,174,0,1202,1203,3,351,174,0, - 1203,1205,1,0,0,0,1204,1196,1,0,0,0,1204,1197,1,0,0,0,1204,1198, - 1,0,0,0,1204,1201,1,0,0,0,1205,1208,1,0,0,0,1206,1204,1,0,0,0,1206, - 1207,1,0,0,0,1207,1209,1,0,0,0,1208,1206,1,0,0,0,1209,1210,3,351, - 174,0,1210,224,1,0,0,0,1211,1212,7,3,0,0,1212,226,1,0,0,0,1213,1214, - 7,4,0,0,1214,228,1,0,0,0,1215,1216,7,5,0,0,1216,230,1,0,0,0,1217, - 1218,7,6,0,0,1218,232,1,0,0,0,1219,1220,7,7,0,0,1220,234,1,0,0,0, - 1221,1222,7,8,0,0,1222,236,1,0,0,0,1223,1224,7,9,0,0,1224,238,1, - 0,0,0,1225,1226,7,10,0,0,1226,240,1,0,0,0,1227,1228,7,11,0,0,1228, - 242,1,0,0,0,1229,1230,7,12,0,0,1230,244,1,0,0,0,1231,1232,7,13,0, - 0,1232,246,1,0,0,0,1233,1234,7,14,0,0,1234,248,1,0,0,0,1235,1236, - 7,15,0,0,1236,250,1,0,0,0,1237,1238,7,16,0,0,1238,252,1,0,0,0,1239, - 1240,7,17,0,0,1240,254,1,0,0,0,1241,1242,7,18,0,0,1242,256,1,0,0, - 0,1243,1244,7,19,0,0,1244,258,1,0,0,0,1245,1246,7,20,0,0,1246,260, - 1,0,0,0,1247,1248,7,21,0,0,1248,262,1,0,0,0,1249,1250,7,22,0,0,1250, - 264,1,0,0,0,1251,1252,7,23,0,0,1252,266,1,0,0,0,1253,1254,7,24,0, - 0,1254,268,1,0,0,0,1255,1256,7,25,0,0,1256,270,1,0,0,0,1257,1258, - 7,26,0,0,1258,272,1,0,0,0,1259,1260,7,27,0,0,1260,274,1,0,0,0,1261, - 1262,7,28,0,0,1262,276,1,0,0,0,1263,1264,7,29,0,0,1264,278,1,0,0, - 0,1265,1266,7,30,0,0,1266,280,1,0,0,0,1267,1268,7,31,0,0,1268,282, - 1,0,0,0,1269,1270,7,32,0,0,1270,284,1,0,0,0,1271,1272,5,45,0,0,1272, - 1273,5,62,0,0,1273,286,1,0,0,0,1274,1275,5,42,0,0,1275,288,1,0,0, - 0,1276,1277,5,96,0,0,1277,290,1,0,0,0,1278,1279,5,92,0,0,1279,292, - 1,0,0,0,1280,1281,5,58,0,0,1281,294,1,0,0,0,1282,1283,5,44,0,0,1283, - 296,1,0,0,0,1284,1285,5,124,0,0,1285,1286,5,124,0,0,1286,298,1,0, - 0,0,1287,1288,5,45,0,0,1288,300,1,0,0,0,1289,1290,5,36,0,0,1290, - 302,1,0,0,0,1291,1292,5,46,0,0,1292,304,1,0,0,0,1293,1294,5,61,0, - 0,1294,1295,5,61,0,0,1295,306,1,0,0,0,1296,1297,5,61,0,0,1297,308, - 1,0,0,0,1298,1299,5,62,0,0,1299,1300,5,61,0,0,1300,310,1,0,0,0,1301, - 1302,5,62,0,0,1302,312,1,0,0,0,1303,1304,5,35,0,0,1304,314,1,0,0, - 0,1305,1306,5,126,0,0,1306,1307,5,42,0,0,1307,316,1,0,0,0,1308,1309, - 5,61,0,0,1309,1310,5,126,0,0,1310,1311,5,42,0,0,1311,318,1,0,0,0, - 1312,1313,5,123,0,0,1313,1314,1,0,0,0,1314,1315,6,158,0,0,1315,320, - 1,0,0,0,1316,1317,5,91,0,0,1317,322,1,0,0,0,1318,1319,5,40,0,0,1319, - 324,1,0,0,0,1320,1321,5,60,0,0,1321,1322,5,61,0,0,1322,326,1,0,0, - 0,1323,1324,5,60,0,0,1324,328,1,0,0,0,1325,1326,5,33,0,0,1326,1330, - 5,61,0,0,1327,1328,5,60,0,0,1328,1330,5,62,0,0,1329,1325,1,0,0,0, - 1329,1327,1,0,0,0,1330,330,1,0,0,0,1331,1332,5,33,0,0,1332,1333, - 5,126,0,0,1333,1334,5,42,0,0,1334,332,1,0,0,0,1335,1336,5,33,0,0, - 1336,1337,5,126,0,0,1337,334,1,0,0,0,1338,1339,5,63,0,0,1339,1340, - 5,46,0,0,1340,336,1,0,0,0,1341,1342,5,63,0,0,1342,1343,5,63,0,0, - 1343,338,1,0,0,0,1344,1345,5,37,0,0,1345,340,1,0,0,0,1346,1347,5, - 43,0,0,1347,342,1,0,0,0,1348,1349,5,63,0,0,1349,344,1,0,0,0,1350, - 1351,5,34,0,0,1351,346,1,0,0,0,1352,1353,5,102,0,0,1353,1354,5,39, - 0,0,1354,1355,1,0,0,0,1355,1356,6,172,1,0,1356,348,1,0,0,0,1357, - 1358,5,70,0,0,1358,1359,5,39,0,0,1359,1360,1,0,0,0,1360,1361,6,173, - 2,0,1361,350,1,0,0,0,1362,1363,5,39,0,0,1363,352,1,0,0,0,1364,1365, - 5,126,0,0,1365,354,1,0,0,0,1366,1367,5,61,0,0,1367,1368,5,126,0, - 0,1368,356,1,0,0,0,1369,1370,5,125,0,0,1370,1371,1,0,0,0,1371,1372, - 6,177,3,0,1372,358,1,0,0,0,1373,1374,5,93,0,0,1374,360,1,0,0,0,1375, - 1376,5,41,0,0,1376,362,1,0,0,0,1377,1378,5,59,0,0,1378,364,1,0,0, - 0,1379,1380,5,47,0,0,1380,366,1,0,0,0,1381,1382,5,95,0,0,1382,368, - 1,0,0,0,1383,1384,5,47,0,0,1384,1385,5,42,0,0,1385,1389,1,0,0,0, - 1386,1388,9,0,0,0,1387,1386,1,0,0,0,1388,1391,1,0,0,0,1389,1390, - 1,0,0,0,1389,1387,1,0,0,0,1390,1392,1,0,0,0,1391,1389,1,0,0,0,1392, - 1393,5,42,0,0,1393,1394,5,47,0,0,1394,1395,1,0,0,0,1395,1396,6,183, - 4,0,1396,370,1,0,0,0,1397,1398,5,45,0,0,1398,1402,5,45,0,0,1399, - 1400,5,47,0,0,1400,1402,5,47,0,0,1401,1397,1,0,0,0,1401,1399,1,0, - 0,0,1402,1406,1,0,0,0,1403,1405,8,33,0,0,1404,1403,1,0,0,0,1405, - 1408,1,0,0,0,1406,1404,1,0,0,0,1406,1407,1,0,0,0,1407,1410,1,0,0, - 0,1408,1406,1,0,0,0,1409,1411,7,34,0,0,1410,1409,1,0,0,0,1411,1412, - 1,0,0,0,1412,1413,6,184,4,0,1413,372,1,0,0,0,1414,1415,7,35,0,0, - 1415,1416,1,0,0,0,1416,1417,6,185,5,0,1417,374,1,0,0,0,1418,1430, - 8,36,0,0,1419,1430,3,211,104,0,1420,1421,3,291,144,0,1421,1422,3, - 351,174,0,1422,1430,1,0,0,0,1423,1424,3,291,144,0,1424,1425,3,319, - 158,0,1425,1430,1,0,0,0,1426,1427,3,351,174,0,1427,1428,3,351,174, - 0,1428,1430,1,0,0,0,1429,1418,1,0,0,0,1429,1419,1,0,0,0,1429,1420, - 1,0,0,0,1429,1423,1,0,0,0,1429,1426,1,0,0,0,1430,1431,1,0,0,0,1431, - 1429,1,0,0,0,1431,1432,1,0,0,0,1432,376,1,0,0,0,1433,1434,3,319, - 158,0,1434,1435,1,0,0,0,1435,1436,6,187,0,0,1436,378,1,0,0,0,1437, - 1438,3,351,174,0,1438,1439,1,0,0,0,1439,1440,6,188,6,0,1440,1441, - 6,188,3,0,1441,380,1,0,0,0,1442,1448,8,37,0,0,1443,1448,3,211,104, - 0,1444,1445,3,291,144,0,1445,1446,3,319,158,0,1446,1448,1,0,0,0, - 1447,1442,1,0,0,0,1447,1443,1,0,0,0,1447,1444,1,0,0,0,1448,1449, - 1,0,0,0,1449,1447,1,0,0,0,1449,1450,1,0,0,0,1450,382,1,0,0,0,1451, - 1452,3,319,158,0,1452,1453,1,0,0,0,1453,1454,6,190,0,0,1454,384, - 1,0,0,0,44,0,1,2,425,646,1020,1049,1054,1060,1062,1074,1076,1090, - 1092,1097,1104,1109,1113,1118,1123,1127,1132,1139,1145,1150,1157, - 1162,1168,1173,1175,1181,1186,1193,1204,1206,1329,1389,1401,1406, - 1410,1429,1431,1447,1449,7,5,0,0,5,1,0,5,2,0,4,0,0,6,0,0,0,1,0,7, - 145,0 + 7,190,2,191,7,191,2,192,7,192,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,1, + 2,1,2,1,2,1,2,1,2,1,3,1,3,1,3,1,3,1,4,1,4,1,4,1,4,1,4,1,4,1,5,1, + 5,1,5,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,1,6,3, + 6,430,8,6,1,7,1,7,1,7,1,7,1,7,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1,8,1, + 9,1,9,1,9,1,9,1,9,1,10,1,10,1,10,1,11,1,11,1,11,1,11,1,11,1,12,1, + 12,1,12,1,12,1,12,1,13,1,13,1,13,1,13,1,13,1,13,1,14,1,14,1,14,1, + 14,1,14,1,14,1,14,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,15,1,16,1, + 16,1,16,1,16,1,16,1,16,1,17,1,17,1,17,1,17,1,17,1,18,1,18,1,18,1, + 18,1,18,1,18,1,18,1,18,1,19,1,19,1,19,1,19,1,19,1,20,1,20,1,20,1, + 20,1,21,1,21,1,21,1,21,1,21,1,22,1,22,1,22,1,22,1,22,1,22,1,22,1, + 22,1,22,1,22,1,22,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1,23,1, + 24,1,24,1,24,1,24,1,24,1,25,1,25,1,25,1,25,1,26,1,26,1,26,1,26,1, + 26,1,26,1,26,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,27,1,28,1,28,1, + 28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,1,30,1, + 30,1,30,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32,1, + 32,1,32,1,32,1,32,1,32,1,33,1,33,1,33,1,33,1,34,1,34,1,34,1,34,1, + 34,1,35,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1,37,1,37,1, + 37,1,37,1,37,1,38,1,38,1,38,1,38,1,38,1,38,1,38,1,39,1,39,1,39,1, + 39,1,39,1,40,1,40,1,40,1,41,1,41,1,41,1,42,1,42,1,42,1,42,1,42,1, + 42,1,43,1,43,1,43,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1,44,1, + 44,1,44,1,44,1,44,3,44,658,8,44,1,45,1,45,1,45,1,45,1,45,1,45,1, + 46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,46,1,47,1,47,1,47,1, + 47,1,47,1,47,1,47,1,47,1,47,1,48,1,48,1,48,1,49,1,49,1,49,1,49,1, + 49,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1, + 52,1,52,1,52,1,52,1,52,1,53,1,53,1,53,1,53,1,53,1,54,1,54,1,54,1, + 54,1,55,1,55,1,55,1,55,1,55,1,56,1,56,1,56,1,56,1,56,1,56,1,57,1, + 57,1,57,1,57,1,57,1,57,1,57,1,58,1,58,1,58,1,58,1,58,1,58,1,59,1, + 59,1,59,1,59,1,60,1,60,1,60,1,60,1,61,1,61,1,61,1,61,1,61,1,62,1, + 62,1,62,1,62,1,62,1,62,1,63,1,63,1,63,1,63,1,63,1,63,1,63,1,64,1, + 64,1,64,1,65,1,65,1,65,1,66,1,66,1,66,1,66,1,66,1,66,1,67,1,67,1, + 67,1,67,1,67,1,67,1,68,1,68,1,68,1,68,1,68,1,69,1,69,1,69,1,69,1, + 69,1,69,1,69,1,69,1,69,1,69,1,70,1,70,1,70,1,70,1,70,1,70,1,70,1, + 70,1,70,1,70,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,71,1,72,1, + 72,1,72,1,72,1,72,1,72,1,72,1,72,1,73,1,73,1,73,1,73,1,73,1,73,1, + 74,1,74,1,74,1,74,1,74,1,74,1,74,1,75,1,75,1,75,1,75,1,75,1,75,1, + 76,1,76,1,76,1,76,1,76,1,76,1,76,1,77,1,77,1,77,1,77,1,78,1,78,1, + 78,1,78,1,78,1,79,1,79,1,79,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1, + 80,1,80,1,80,1,80,1,81,1,81,1,81,1,81,1,81,1,81,1,81,1,82,1,82,1, + 82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,83,1,84,1, + 84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,84,1,85,1,85,1,85,1,85,1, + 85,1,86,1,86,1,86,1,86,1,86,1,86,1,87,1,87,1,87,1,87,1,87,1,88,1, + 88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,88,1,89,1,89,1,89,1,90,1, + 90,1,90,1,90,1,91,1,91,1,91,1,91,1,91,1,91,1,91,1,92,1,92,1,92,1, + 92,1,92,1,92,1,92,1,92,1,92,1,93,1,93,1,93,1,93,1,93,1,94,1,94,1, + 94,1,94,1,94,1,94,1,94,1,94,1,94,1,95,1,95,1,95,1,95,1,96,1,96,1, + 96,1,96,1,96,1,96,1,96,1,96,1,96,1,96,1,97,1,97,1,97,1,97,1,97,1, + 97,1,98,1,98,1,98,1,98,1,98,1,98,1,99,1,99,1,99,1,99,1,99,1,100, + 1,100,1,100,1,100,1,100,1,101,1,101,1,101,1,101,1,101,1,101,1,102, + 1,102,1,102,1,102,1,102,1,102,1,103,1,103,1,103,1,103,1,103,1,103, + 1,103,1,104,1,104,1,104,1,104,1,104,1,105,1,105,1,105,1,105,1,105, + 1,105,1,105,1,105,1,105,1,105,3,105,1042,8,105,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106,1,106, + 1,106,1,106,3,106,1071,8,106,1,107,1,107,1,107,3,107,1076,8,107, + 1,107,1,107,1,107,1,107,5,107,1082,8,107,10,107,12,107,1085,9,107, + 1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,1,107,5,107,1096, + 8,107,10,107,12,107,1099,9,107,1,107,1,107,1,107,1,107,1,107,1,107, + 1,107,1,107,1,107,1,107,1,107,5,107,1112,8,107,10,107,12,107,1115, + 9,107,1,107,1,107,3,107,1119,8,107,1,108,1,108,1,108,5,108,1124, + 8,108,10,108,12,108,1127,9,108,1,108,1,108,3,108,1131,8,108,1,108, + 1,108,3,108,1135,8,108,1,108,4,108,1138,8,108,11,108,12,108,1139, + 1,108,1,108,1,108,3,108,1145,8,108,1,108,1,108,3,108,1149,8,108, + 1,108,4,108,1152,8,108,11,108,12,108,1153,1,108,1,108,1,108,5,108, + 1159,8,108,10,108,12,108,1162,9,108,1,108,1,108,1,108,3,108,1167, + 8,108,1,108,4,108,1170,8,108,11,108,12,108,1171,1,108,1,108,1,108, + 1,108,1,108,3,108,1179,8,108,1,108,4,108,1182,8,108,11,108,12,108, + 1183,1,108,1,108,1,108,1,108,3,108,1190,8,108,1,108,4,108,1193,8, + 108,11,108,12,108,1194,3,108,1197,8,108,1,109,1,109,4,109,1201,8, + 109,11,109,12,109,1202,1,110,4,110,1206,8,110,11,110,12,110,1207, + 1,111,1,111,1,111,4,111,1213,8,111,11,111,12,111,1214,1,112,1,112, + 1,112,1,112,1,112,1,112,1,112,1,112,1,112,5,112,1226,8,112,10,112, + 12,112,1229,9,112,1,112,1,112,1,113,1,113,1,114,1,114,1,115,1,115, + 1,116,1,116,1,117,1,117,1,118,1,118,1,119,1,119,1,120,1,120,1,121, + 1,121,1,122,1,122,1,123,1,123,1,124,1,124,1,125,1,125,1,126,1,126, + 1,127,1,127,1,128,1,128,1,129,1,129,1,130,1,130,1,131,1,131,1,132, + 1,132,1,133,1,133,1,134,1,134,1,135,1,135,1,136,1,136,1,137,1,137, + 1,138,1,138,1,139,1,139,1,140,1,140,1,141,1,141,1,142,1,142,1,143, + 1,143,1,143,1,144,1,144,1,145,1,145,1,146,1,146,1,147,1,147,1,148, + 1,148,1,149,1,149,1,149,1,150,1,150,1,151,1,151,1,152,1,152,1,153, + 1,153,1,153,1,154,1,154,1,155,1,155,1,155,1,156,1,156,1,157,1,157, + 1,158,1,158,1,158,1,159,1,159,1,159,1,159,1,160,1,160,1,160,1,160, + 1,161,1,161,1,162,1,162,1,163,1,163,1,163,1,164,1,164,1,165,1,165, + 1,165,1,165,3,165,1351,8,165,1,166,1,166,1,166,1,166,1,167,1,167, + 1,167,1,168,1,168,1,168,1,169,1,169,1,169,1,170,1,170,1,171,1,171, + 1,172,1,172,1,173,1,173,1,174,1,174,1,174,1,174,1,174,1,175,1,175, + 1,175,1,175,1,175,1,176,1,176,1,177,1,177,1,178,1,178,1,178,1,179, + 1,179,1,179,1,179,1,180,1,180,1,181,1,181,1,182,1,182,1,183,1,183, + 1,184,1,184,1,185,1,185,1,185,1,185,5,185,1409,8,185,10,185,12,185, + 1412,9,185,1,185,1,185,1,185,1,185,1,185,1,186,1,186,1,186,1,186, + 3,186,1423,8,186,1,186,5,186,1426,8,186,10,186,12,186,1429,9,186, + 1,186,3,186,1432,8,186,1,186,1,186,1,187,1,187,1,187,1,187,1,188, + 1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,1,188,4,188, + 1451,8,188,11,188,12,188,1452,1,189,1,189,1,189,1,189,1,190,1,190, + 1,190,1,190,1,190,1,191,1,191,1,191,1,191,1,191,4,191,1469,8,191, + 11,191,12,191,1470,1,192,1,192,1,192,1,192,1,1410,0,193,3,1,5,2, + 7,3,9,4,11,5,13,6,15,7,17,8,19,9,21,10,23,11,25,12,27,13,29,14,31, + 15,33,16,35,17,37,18,39,19,41,20,43,21,45,22,47,23,49,24,51,25,53, + 26,55,27,57,28,59,29,61,30,63,31,65,32,67,33,69,34,71,35,73,36,75, + 37,77,38,79,39,81,40,83,41,85,42,87,43,89,44,91,45,93,46,95,47,97, + 48,99,49,101,50,103,51,105,52,107,53,109,54,111,55,113,56,115,57, + 117,58,119,59,121,60,123,61,125,62,127,63,129,64,131,65,133,66,135, + 67,137,68,139,69,141,70,143,71,145,72,147,73,149,74,151,75,153,76, + 155,77,157,78,159,79,161,80,163,81,165,82,167,83,169,84,171,85,173, + 86,175,87,177,88,179,89,181,90,183,91,185,92,187,93,189,94,191,95, + 193,96,195,97,197,98,199,99,201,100,203,101,205,102,207,103,209, + 104,211,105,213,106,215,107,217,108,219,109,221,110,223,111,225, + 112,227,113,229,0,231,0,233,0,235,0,237,0,239,0,241,0,243,0,245, + 0,247,0,249,0,251,0,253,0,255,0,257,0,259,0,261,0,263,0,265,0,267, + 0,269,0,271,0,273,0,275,0,277,0,279,0,281,0,283,0,285,0,287,0,289, + 114,291,115,293,116,295,117,297,118,299,119,301,120,303,121,305, + 122,307,123,309,124,311,125,313,126,315,127,317,128,319,129,321, + 130,323,131,325,132,327,133,329,134,331,135,333,136,335,137,337, + 138,339,139,341,140,343,141,345,142,347,143,349,144,351,145,353, + 146,355,147,357,148,359,149,361,150,363,151,365,152,367,153,369, + 154,371,155,373,156,375,157,377,158,379,159,381,160,383,0,385,161, + 387,162,3,0,1,2,38,2,0,92,92,96,96,2,0,34,34,92,92,2,0,39,39,92, + 92,2,0,65,65,97,97,2,0,66,66,98,98,2,0,67,67,99,99,2,0,68,68,100, + 100,2,0,69,69,101,101,2,0,70,70,102,102,2,0,71,71,103,103,2,0,72, + 72,104,104,2,0,73,73,105,105,2,0,74,74,106,106,2,0,75,75,107,107, + 2,0,76,76,108,108,2,0,77,77,109,109,2,0,78,78,110,110,2,0,79,79, + 111,111,2,0,80,80,112,112,2,0,81,81,113,113,2,0,82,82,114,114,2, + 0,83,83,115,115,2,0,84,84,116,116,2,0,85,85,117,117,2,0,86,86,118, + 118,2,0,87,87,119,119,2,0,88,88,120,120,2,0,89,89,121,121,2,0,90, + 90,122,122,2,0,65,90,97,122,1,0,48,55,1,0,48,57,3,0,48,57,65,70, + 97,102,2,0,10,10,13,13,2,1,10,10,13,13,2,0,9,13,32,32,3,0,39,39, + 92,92,123,123,1,0,123,123,1512,0,3,1,0,0,0,0,5,1,0,0,0,0,7,1,0,0, + 0,0,9,1,0,0,0,0,11,1,0,0,0,0,13,1,0,0,0,0,15,1,0,0,0,0,17,1,0,0, + 0,0,19,1,0,0,0,0,21,1,0,0,0,0,23,1,0,0,0,0,25,1,0,0,0,0,27,1,0,0, + 0,0,29,1,0,0,0,0,31,1,0,0,0,0,33,1,0,0,0,0,35,1,0,0,0,0,37,1,0,0, + 0,0,39,1,0,0,0,0,41,1,0,0,0,0,43,1,0,0,0,0,45,1,0,0,0,0,47,1,0,0, + 0,0,49,1,0,0,0,0,51,1,0,0,0,0,53,1,0,0,0,0,55,1,0,0,0,0,57,1,0,0, + 0,0,59,1,0,0,0,0,61,1,0,0,0,0,63,1,0,0,0,0,65,1,0,0,0,0,67,1,0,0, + 0,0,69,1,0,0,0,0,71,1,0,0,0,0,73,1,0,0,0,0,75,1,0,0,0,0,77,1,0,0, + 0,0,79,1,0,0,0,0,81,1,0,0,0,0,83,1,0,0,0,0,85,1,0,0,0,0,87,1,0,0, + 0,0,89,1,0,0,0,0,91,1,0,0,0,0,93,1,0,0,0,0,95,1,0,0,0,0,97,1,0,0, + 0,0,99,1,0,0,0,0,101,1,0,0,0,0,103,1,0,0,0,0,105,1,0,0,0,0,107,1, + 0,0,0,0,109,1,0,0,0,0,111,1,0,0,0,0,113,1,0,0,0,0,115,1,0,0,0,0, + 117,1,0,0,0,0,119,1,0,0,0,0,121,1,0,0,0,0,123,1,0,0,0,0,125,1,0, + 0,0,0,127,1,0,0,0,0,129,1,0,0,0,0,131,1,0,0,0,0,133,1,0,0,0,0,135, + 1,0,0,0,0,137,1,0,0,0,0,139,1,0,0,0,0,141,1,0,0,0,0,143,1,0,0,0, + 0,145,1,0,0,0,0,147,1,0,0,0,0,149,1,0,0,0,0,151,1,0,0,0,0,153,1, + 0,0,0,0,155,1,0,0,0,0,157,1,0,0,0,0,159,1,0,0,0,0,161,1,0,0,0,0, + 163,1,0,0,0,0,165,1,0,0,0,0,167,1,0,0,0,0,169,1,0,0,0,0,171,1,0, + 0,0,0,173,1,0,0,0,0,175,1,0,0,0,0,177,1,0,0,0,0,179,1,0,0,0,0,181, + 1,0,0,0,0,183,1,0,0,0,0,185,1,0,0,0,0,187,1,0,0,0,0,189,1,0,0,0, + 0,191,1,0,0,0,0,193,1,0,0,0,0,195,1,0,0,0,0,197,1,0,0,0,0,199,1, + 0,0,0,0,201,1,0,0,0,0,203,1,0,0,0,0,205,1,0,0,0,0,207,1,0,0,0,0, + 209,1,0,0,0,0,211,1,0,0,0,0,213,1,0,0,0,0,215,1,0,0,0,0,217,1,0, + 0,0,0,219,1,0,0,0,0,221,1,0,0,0,0,223,1,0,0,0,0,225,1,0,0,0,0,227, + 1,0,0,0,0,289,1,0,0,0,0,291,1,0,0,0,0,293,1,0,0,0,0,295,1,0,0,0, + 0,297,1,0,0,0,0,299,1,0,0,0,0,301,1,0,0,0,0,303,1,0,0,0,0,305,1, + 0,0,0,0,307,1,0,0,0,0,309,1,0,0,0,0,311,1,0,0,0,0,313,1,0,0,0,0, + 315,1,0,0,0,0,317,1,0,0,0,0,319,1,0,0,0,0,321,1,0,0,0,0,323,1,0, + 0,0,0,325,1,0,0,0,0,327,1,0,0,0,0,329,1,0,0,0,0,331,1,0,0,0,0,333, + 1,0,0,0,0,335,1,0,0,0,0,337,1,0,0,0,0,339,1,0,0,0,0,341,1,0,0,0, + 0,343,1,0,0,0,0,345,1,0,0,0,0,347,1,0,0,0,0,349,1,0,0,0,0,351,1, + 0,0,0,0,353,1,0,0,0,0,355,1,0,0,0,0,357,1,0,0,0,0,359,1,0,0,0,0, + 361,1,0,0,0,0,363,1,0,0,0,0,365,1,0,0,0,0,367,1,0,0,0,0,369,1,0, + 0,0,0,371,1,0,0,0,0,373,1,0,0,0,0,375,1,0,0,0,0,377,1,0,0,0,1,379, + 1,0,0,0,1,381,1,0,0,0,1,383,1,0,0,0,2,385,1,0,0,0,2,387,1,0,0,0, + 3,389,1,0,0,0,5,393,1,0,0,0,7,397,1,0,0,0,9,402,1,0,0,0,11,406,1, + 0,0,0,13,412,1,0,0,0,15,429,1,0,0,0,17,431,1,0,0,0,19,436,1,0,0, + 0,21,444,1,0,0,0,23,449,1,0,0,0,25,452,1,0,0,0,27,457,1,0,0,0,29, + 462,1,0,0,0,31,468,1,0,0,0,33,475,1,0,0,0,35,483,1,0,0,0,37,489, + 1,0,0,0,39,494,1,0,0,0,41,502,1,0,0,0,43,507,1,0,0,0,45,511,1,0, + 0,0,47,516,1,0,0,0,49,527,1,0,0,0,51,536,1,0,0,0,53,541,1,0,0,0, + 55,545,1,0,0,0,57,552,1,0,0,0,59,560,1,0,0,0,61,566,1,0,0,0,63,574, + 1,0,0,0,65,580,1,0,0,0,67,583,1,0,0,0,69,593,1,0,0,0,71,597,1,0, + 0,0,73,602,1,0,0,0,75,607,1,0,0,0,77,611,1,0,0,0,79,617,1,0,0,0, + 81,624,1,0,0,0,83,629,1,0,0,0,85,632,1,0,0,0,87,635,1,0,0,0,89,641, + 1,0,0,0,91,657,1,0,0,0,93,659,1,0,0,0,95,665,1,0,0,0,97,675,1,0, + 0,0,99,684,1,0,0,0,101,687,1,0,0,0,103,692,1,0,0,0,105,696,1,0,0, + 0,107,701,1,0,0,0,109,709,1,0,0,0,111,714,1,0,0,0,113,718,1,0,0, + 0,115,723,1,0,0,0,117,729,1,0,0,0,119,736,1,0,0,0,121,742,1,0,0, + 0,123,746,1,0,0,0,125,750,1,0,0,0,127,755,1,0,0,0,129,761,1,0,0, + 0,131,768,1,0,0,0,133,771,1,0,0,0,135,774,1,0,0,0,137,780,1,0,0, + 0,139,786,1,0,0,0,141,791,1,0,0,0,143,801,1,0,0,0,145,811,1,0,0, + 0,147,820,1,0,0,0,149,828,1,0,0,0,151,834,1,0,0,0,153,841,1,0,0, + 0,155,847,1,0,0,0,157,854,1,0,0,0,159,858,1,0,0,0,161,863,1,0,0, + 0,163,870,1,0,0,0,165,877,1,0,0,0,167,884,1,0,0,0,169,889,1,0,0, + 0,171,898,1,0,0,0,173,908,1,0,0,0,175,913,1,0,0,0,177,919,1,0,0, + 0,179,924,1,0,0,0,181,934,1,0,0,0,183,937,1,0,0,0,185,941,1,0,0, + 0,187,948,1,0,0,0,189,957,1,0,0,0,191,962,1,0,0,0,193,971,1,0,0, + 0,195,975,1,0,0,0,197,985,1,0,0,0,199,991,1,0,0,0,201,997,1,0,0, + 0,203,1002,1,0,0,0,205,1007,1,0,0,0,207,1013,1,0,0,0,209,1019,1, + 0,0,0,211,1026,1,0,0,0,213,1041,1,0,0,0,215,1070,1,0,0,0,217,1118, + 1,0,0,0,219,1196,1,0,0,0,221,1198,1,0,0,0,223,1205,1,0,0,0,225,1209, + 1,0,0,0,227,1216,1,0,0,0,229,1232,1,0,0,0,231,1234,1,0,0,0,233,1236, + 1,0,0,0,235,1238,1,0,0,0,237,1240,1,0,0,0,239,1242,1,0,0,0,241,1244, + 1,0,0,0,243,1246,1,0,0,0,245,1248,1,0,0,0,247,1250,1,0,0,0,249,1252, + 1,0,0,0,251,1254,1,0,0,0,253,1256,1,0,0,0,255,1258,1,0,0,0,257,1260, + 1,0,0,0,259,1262,1,0,0,0,261,1264,1,0,0,0,263,1266,1,0,0,0,265,1268, + 1,0,0,0,267,1270,1,0,0,0,269,1272,1,0,0,0,271,1274,1,0,0,0,273,1276, + 1,0,0,0,275,1278,1,0,0,0,277,1280,1,0,0,0,279,1282,1,0,0,0,281,1284, + 1,0,0,0,283,1286,1,0,0,0,285,1288,1,0,0,0,287,1290,1,0,0,0,289,1292, + 1,0,0,0,291,1295,1,0,0,0,293,1297,1,0,0,0,295,1299,1,0,0,0,297,1301, + 1,0,0,0,299,1303,1,0,0,0,301,1305,1,0,0,0,303,1308,1,0,0,0,305,1310, + 1,0,0,0,307,1312,1,0,0,0,309,1314,1,0,0,0,311,1317,1,0,0,0,313,1319, + 1,0,0,0,315,1322,1,0,0,0,317,1324,1,0,0,0,319,1326,1,0,0,0,321,1329, + 1,0,0,0,323,1333,1,0,0,0,325,1337,1,0,0,0,327,1339,1,0,0,0,329,1341, + 1,0,0,0,331,1344,1,0,0,0,333,1350,1,0,0,0,335,1352,1,0,0,0,337,1356, + 1,0,0,0,339,1359,1,0,0,0,341,1362,1,0,0,0,343,1365,1,0,0,0,345,1367, + 1,0,0,0,347,1369,1,0,0,0,349,1371,1,0,0,0,351,1373,1,0,0,0,353,1378, + 1,0,0,0,355,1383,1,0,0,0,357,1385,1,0,0,0,359,1387,1,0,0,0,361,1390, + 1,0,0,0,363,1394,1,0,0,0,365,1396,1,0,0,0,367,1398,1,0,0,0,369,1400, + 1,0,0,0,371,1402,1,0,0,0,373,1404,1,0,0,0,375,1422,1,0,0,0,377,1435, + 1,0,0,0,379,1450,1,0,0,0,381,1454,1,0,0,0,383,1458,1,0,0,0,385,1468, + 1,0,0,0,387,1472,1,0,0,0,389,390,3,229,113,0,390,391,3,251,124,0, + 391,392,3,251,124,0,392,4,1,0,0,0,393,394,3,229,113,0,394,395,3, + 255,126,0,395,396,3,235,116,0,396,6,1,0,0,0,397,398,3,229,113,0, + 398,399,3,255,126,0,399,400,3,267,132,0,400,401,3,245,121,0,401, + 8,1,0,0,0,402,403,3,229,113,0,403,404,3,255,126,0,404,405,3,277, + 137,0,405,10,1,0,0,0,406,407,3,229,113,0,407,408,3,263,130,0,408, + 409,3,263,130,0,409,410,3,229,113,0,410,411,3,277,137,0,411,12,1, + 0,0,0,412,413,3,229,113,0,413,414,3,265,131,0,414,14,1,0,0,0,415, + 416,3,229,113,0,416,417,3,265,131,0,417,418,3,233,115,0,418,430, + 1,0,0,0,419,420,3,229,113,0,420,421,3,265,131,0,421,422,3,233,115, + 0,422,423,3,237,117,0,423,424,3,255,126,0,424,425,3,235,116,0,425, + 426,3,245,121,0,426,427,3,255,126,0,427,428,3,241,119,0,428,430, + 1,0,0,0,429,415,1,0,0,0,429,419,1,0,0,0,430,16,1,0,0,0,431,432,3, + 229,113,0,432,433,3,265,131,0,433,434,3,257,127,0,434,435,3,239, + 118,0,435,18,1,0,0,0,436,437,3,231,114,0,437,438,3,237,117,0,438, + 439,3,267,132,0,439,440,3,273,135,0,440,441,3,237,117,0,441,442, + 3,237,117,0,442,443,3,255,126,0,443,20,1,0,0,0,444,445,3,231,114, + 0,445,446,3,257,127,0,446,447,3,267,132,0,447,448,3,243,120,0,448, + 22,1,0,0,0,449,450,3,231,114,0,450,451,3,277,137,0,451,24,1,0,0, + 0,452,453,3,233,115,0,453,454,3,229,113,0,454,455,3,265,131,0,455, + 456,3,237,117,0,456,26,1,0,0,0,457,458,3,233,115,0,458,459,3,229, + 113,0,459,460,3,265,131,0,460,461,3,267,132,0,461,28,1,0,0,0,462, + 463,3,233,115,0,463,464,3,229,113,0,464,465,3,267,132,0,465,466, + 3,233,115,0,466,467,3,243,120,0,467,30,1,0,0,0,468,469,3,233,115, + 0,469,470,3,257,127,0,470,471,3,243,120,0,471,472,3,257,127,0,472, + 473,3,263,130,0,473,474,3,267,132,0,474,32,1,0,0,0,475,476,3,233, + 115,0,476,477,3,257,127,0,477,478,3,251,124,0,478,479,3,251,124, + 0,479,480,3,229,113,0,480,481,3,267,132,0,481,482,3,237,117,0,482, + 34,1,0,0,0,483,484,3,233,115,0,484,485,3,263,130,0,485,486,3,257, + 127,0,486,487,3,265,131,0,487,488,3,265,131,0,488,36,1,0,0,0,489, + 490,3,233,115,0,490,491,3,269,133,0,491,492,3,231,114,0,492,493, + 3,237,117,0,493,38,1,0,0,0,494,495,3,233,115,0,495,496,3,269,133, + 0,496,497,3,263,130,0,497,498,3,263,130,0,498,499,3,237,117,0,499, + 500,3,255,126,0,500,501,3,267,132,0,501,40,1,0,0,0,502,503,3,235, + 116,0,503,504,3,229,113,0,504,505,3,267,132,0,505,506,3,237,117, + 0,506,42,1,0,0,0,507,508,3,235,116,0,508,509,3,229,113,0,509,510, + 3,277,137,0,510,44,1,0,0,0,511,512,3,235,116,0,512,513,3,237,117, + 0,513,514,3,265,131,0,514,515,3,233,115,0,515,46,1,0,0,0,516,517, + 3,235,116,0,517,518,3,237,117,0,518,519,3,265,131,0,519,520,3,233, + 115,0,520,521,3,237,117,0,521,522,3,255,126,0,522,523,3,235,116, + 0,523,524,3,245,121,0,524,525,3,255,126,0,525,526,3,241,119,0,526, + 48,1,0,0,0,527,528,3,235,116,0,528,529,3,245,121,0,529,530,3,265, + 131,0,530,531,3,267,132,0,531,532,3,245,121,0,532,533,3,255,126, + 0,533,534,3,233,115,0,534,535,3,267,132,0,535,50,1,0,0,0,536,537, + 3,237,117,0,537,538,3,251,124,0,538,539,3,265,131,0,539,540,3,237, + 117,0,540,52,1,0,0,0,541,542,3,237,117,0,542,543,3,255,126,0,543, + 544,3,235,116,0,544,54,1,0,0,0,545,546,3,237,117,0,546,547,3,275, + 136,0,547,548,3,233,115,0,548,549,3,237,117,0,549,550,3,259,128, + 0,550,551,3,267,132,0,551,56,1,0,0,0,552,553,3,237,117,0,553,554, + 3,275,136,0,554,555,3,267,132,0,555,556,3,263,130,0,556,557,3,229, + 113,0,557,558,3,233,115,0,558,559,3,267,132,0,559,58,1,0,0,0,560, + 561,3,239,118,0,561,562,3,245,121,0,562,563,3,255,126,0,563,564, + 3,229,113,0,564,565,3,251,124,0,565,60,1,0,0,0,566,567,3,239,118, + 0,567,568,3,245,121,0,568,569,3,255,126,0,569,570,3,229,113,0,570, + 571,3,251,124,0,571,572,3,251,124,0,572,573,3,277,137,0,573,62,1, + 0,0,0,574,575,3,239,118,0,575,576,3,245,121,0,576,577,3,263,130, + 0,577,578,3,265,131,0,578,579,3,267,132,0,579,64,1,0,0,0,580,581, + 3,239,118,0,581,582,3,255,126,0,582,66,1,0,0,0,583,584,3,239,118, + 0,584,585,3,257,127,0,585,586,3,251,124,0,586,587,3,251,124,0,587, + 588,3,257,127,0,588,589,3,273,135,0,589,590,3,245,121,0,590,591, + 3,255,126,0,591,592,3,241,119,0,592,68,1,0,0,0,593,594,3,239,118, + 0,594,595,3,257,127,0,595,596,3,263,130,0,596,70,1,0,0,0,597,598, + 3,239,118,0,598,599,3,263,130,0,599,600,3,257,127,0,600,601,3,253, + 125,0,601,72,1,0,0,0,602,603,3,239,118,0,603,604,3,269,133,0,604, + 605,3,251,124,0,605,606,3,251,124,0,606,74,1,0,0,0,607,608,3,239, + 118,0,608,609,3,269,133,0,609,610,3,255,126,0,610,76,1,0,0,0,611, + 612,3,241,119,0,612,613,3,263,130,0,613,614,3,257,127,0,614,615, + 3,269,133,0,615,616,3,259,128,0,616,78,1,0,0,0,617,618,3,243,120, + 0,618,619,3,229,113,0,619,620,3,271,134,0,620,621,3,245,121,0,621, + 622,3,255,126,0,622,623,3,241,119,0,623,80,1,0,0,0,624,625,3,243, + 120,0,625,626,3,257,127,0,626,627,3,269,133,0,627,628,3,263,130, + 0,628,82,1,0,0,0,629,630,3,245,121,0,630,631,3,235,116,0,631,84, + 1,0,0,0,632,633,3,245,121,0,633,634,3,239,118,0,634,86,1,0,0,0,635, + 636,3,245,121,0,636,637,3,251,124,0,637,638,3,245,121,0,638,639, + 3,249,123,0,639,640,3,237,117,0,640,88,1,0,0,0,641,642,3,245,121, + 0,642,643,3,255,126,0,643,90,1,0,0,0,644,645,3,245,121,0,645,646, + 3,255,126,0,646,647,3,239,118,0,647,658,1,0,0,0,648,649,3,245,121, + 0,649,650,3,255,126,0,650,651,3,239,118,0,651,652,3,245,121,0,652, + 653,3,255,126,0,653,654,3,245,121,0,654,655,3,267,132,0,655,656, + 3,277,137,0,656,658,1,0,0,0,657,644,1,0,0,0,657,648,1,0,0,0,658, + 92,1,0,0,0,659,660,3,245,121,0,660,661,3,255,126,0,661,662,3,255, + 126,0,662,663,3,237,117,0,663,664,3,263,130,0,664,94,1,0,0,0,665, + 666,3,245,121,0,666,667,3,255,126,0,667,668,3,267,132,0,668,669, + 3,237,117,0,669,670,3,263,130,0,670,671,3,265,131,0,671,672,3,237, + 117,0,672,673,3,233,115,0,673,674,3,267,132,0,674,96,1,0,0,0,675, + 676,3,245,121,0,676,677,3,255,126,0,677,678,3,267,132,0,678,679, + 3,237,117,0,679,680,3,263,130,0,680,681,3,271,134,0,681,682,3,229, + 113,0,682,683,3,251,124,0,683,98,1,0,0,0,684,685,3,245,121,0,685, + 686,3,265,131,0,686,100,1,0,0,0,687,688,3,247,122,0,688,689,3,257, + 127,0,689,690,3,245,121,0,690,691,3,255,126,0,691,102,1,0,0,0,692, + 693,3,249,123,0,693,694,3,237,117,0,694,695,3,277,137,0,695,104, + 1,0,0,0,696,697,3,251,124,0,697,698,3,229,113,0,698,699,3,265,131, + 0,699,700,3,267,132,0,700,106,1,0,0,0,701,702,3,251,124,0,702,703, + 3,237,117,0,703,704,3,229,113,0,704,705,3,235,116,0,705,706,3,245, + 121,0,706,707,3,255,126,0,707,708,3,241,119,0,708,108,1,0,0,0,709, + 710,3,251,124,0,710,711,3,237,117,0,711,712,3,239,118,0,712,713, + 3,267,132,0,713,110,1,0,0,0,714,715,3,251,124,0,715,716,3,237,117, + 0,716,717,3,267,132,0,717,112,1,0,0,0,718,719,3,251,124,0,719,720, + 3,245,121,0,720,721,3,249,123,0,721,722,3,237,117,0,722,114,1,0, + 0,0,723,724,3,251,124,0,724,725,3,245,121,0,725,726,3,253,125,0, + 726,727,3,245,121,0,727,728,3,267,132,0,728,116,1,0,0,0,729,730, + 3,253,125,0,730,731,3,245,121,0,731,732,3,255,126,0,732,733,3,269, + 133,0,733,734,3,267,132,0,734,735,3,237,117,0,735,118,1,0,0,0,736, + 737,3,253,125,0,737,738,3,257,127,0,738,739,3,255,126,0,739,740, + 3,267,132,0,740,741,3,243,120,0,741,120,1,0,0,0,742,743,3,255,126, + 0,743,744,3,229,113,0,744,745,3,255,126,0,745,122,1,0,0,0,746,747, + 3,255,126,0,747,748,3,257,127,0,748,749,3,267,132,0,749,124,1,0, + 0,0,750,751,3,255,126,0,751,752,3,269,133,0,752,753,3,251,124,0, + 753,754,3,251,124,0,754,126,1,0,0,0,755,756,3,255,126,0,756,757, + 3,269,133,0,757,758,3,251,124,0,758,759,3,251,124,0,759,760,3,265, + 131,0,760,128,1,0,0,0,761,762,3,257,127,0,762,763,3,239,118,0,763, + 764,3,239,118,0,764,765,3,265,131,0,765,766,3,237,117,0,766,767, + 3,267,132,0,767,130,1,0,0,0,768,769,3,257,127,0,769,770,3,255,126, + 0,770,132,1,0,0,0,771,772,3,257,127,0,772,773,3,263,130,0,773,134, + 1,0,0,0,774,775,3,257,127,0,775,776,3,263,130,0,776,777,3,235,116, + 0,777,778,3,237,117,0,778,779,3,263,130,0,779,136,1,0,0,0,780,781, + 3,257,127,0,781,782,3,269,133,0,782,783,3,267,132,0,783,784,3,237, + 117,0,784,785,3,263,130,0,785,138,1,0,0,0,786,787,3,257,127,0,787, + 788,3,271,134,0,788,789,3,237,117,0,789,790,3,263,130,0,790,140, + 1,0,0,0,791,792,3,259,128,0,792,793,3,229,113,0,793,794,3,263,130, + 0,794,795,3,267,132,0,795,796,3,245,121,0,796,797,3,267,132,0,797, + 798,3,245,121,0,798,799,3,257,127,0,799,800,3,255,126,0,800,142, + 1,0,0,0,801,802,3,259,128,0,802,803,3,263,130,0,803,804,3,237,117, + 0,804,805,3,233,115,0,805,806,3,237,117,0,806,807,3,235,116,0,807, + 808,3,245,121,0,808,809,3,255,126,0,809,810,3,241,119,0,810,144, + 1,0,0,0,811,812,3,259,128,0,812,813,3,263,130,0,813,814,3,237,117, + 0,814,815,3,273,135,0,815,816,3,243,120,0,816,817,3,237,117,0,817, + 818,3,263,130,0,818,819,3,237,117,0,819,146,1,0,0,0,820,821,3,261, + 129,0,821,822,3,269,133,0,822,823,3,229,113,0,823,824,3,263,130, + 0,824,825,3,267,132,0,825,826,3,237,117,0,826,827,3,263,130,0,827, + 148,1,0,0,0,828,829,3,263,130,0,829,830,3,229,113,0,830,831,3,255, + 126,0,831,832,3,241,119,0,832,833,3,237,117,0,833,150,1,0,0,0,834, + 835,3,263,130,0,835,836,3,237,117,0,836,837,3,267,132,0,837,838, + 3,269,133,0,838,839,3,263,130,0,839,840,3,255,126,0,840,152,1,0, + 0,0,841,842,3,263,130,0,842,843,3,245,121,0,843,844,3,241,119,0, + 844,845,3,243,120,0,845,846,3,267,132,0,846,154,1,0,0,0,847,848, + 3,263,130,0,848,849,3,257,127,0,849,850,3,251,124,0,850,851,3,251, + 124,0,851,852,3,269,133,0,852,853,3,259,128,0,853,156,1,0,0,0,854, + 855,3,263,130,0,855,856,3,257,127,0,856,857,3,273,135,0,857,158, + 1,0,0,0,858,859,3,263,130,0,859,860,3,257,127,0,860,861,3,273,135, + 0,861,862,3,265,131,0,862,160,1,0,0,0,863,864,3,265,131,0,864,865, + 3,229,113,0,865,866,3,253,125,0,866,867,3,259,128,0,867,868,3,251, + 124,0,868,869,3,237,117,0,869,162,1,0,0,0,870,871,3,265,131,0,871, + 872,3,237,117,0,872,873,3,233,115,0,873,874,3,257,127,0,874,875, + 3,255,126,0,875,876,3,235,116,0,876,164,1,0,0,0,877,878,3,265,131, + 0,878,879,3,237,117,0,879,880,3,251,124,0,880,881,3,237,117,0,881, + 882,3,233,115,0,882,883,3,267,132,0,883,166,1,0,0,0,884,885,3,265, + 131,0,885,886,3,237,117,0,886,887,3,253,125,0,887,888,3,245,121, + 0,888,168,1,0,0,0,889,890,3,265,131,0,890,891,3,237,117,0,891,892, + 3,267,132,0,892,893,3,267,132,0,893,894,3,245,121,0,894,895,3,255, + 126,0,895,896,3,241,119,0,896,897,3,265,131,0,897,170,1,0,0,0,898, + 899,3,265,131,0,899,900,3,269,133,0,900,901,3,231,114,0,901,902, + 3,265,131,0,902,903,3,267,132,0,903,904,3,263,130,0,904,905,3,245, + 121,0,905,906,3,255,126,0,906,907,3,241,119,0,907,172,1,0,0,0,908, + 909,3,267,132,0,909,910,3,243,120,0,910,911,3,237,117,0,911,912, + 3,255,126,0,912,174,1,0,0,0,913,914,3,267,132,0,914,915,3,243,120, + 0,915,916,3,263,130,0,916,917,3,257,127,0,917,918,3,273,135,0,918, + 176,1,0,0,0,919,920,3,267,132,0,920,921,3,245,121,0,921,922,3,237, + 117,0,922,923,3,265,131,0,923,178,1,0,0,0,924,925,3,267,132,0,925, + 926,3,245,121,0,926,927,3,253,125,0,927,928,3,237,117,0,928,929, + 3,265,131,0,929,930,3,267,132,0,930,931,3,229,113,0,931,932,3,253, + 125,0,932,933,3,259,128,0,933,180,1,0,0,0,934,935,3,267,132,0,935, + 936,3,257,127,0,936,182,1,0,0,0,937,938,3,267,132,0,938,939,3,257, + 127,0,939,940,3,259,128,0,940,184,1,0,0,0,941,942,3,267,132,0,942, + 943,3,257,127,0,943,944,3,267,132,0,944,945,3,229,113,0,945,946, + 3,251,124,0,946,947,3,265,131,0,947,186,1,0,0,0,948,949,3,267,132, + 0,949,950,3,263,130,0,950,951,3,229,113,0,951,952,3,245,121,0,952, + 953,3,251,124,0,953,954,3,245,121,0,954,955,3,255,126,0,955,956, + 3,241,119,0,956,188,1,0,0,0,957,958,3,267,132,0,958,959,3,263,130, + 0,959,960,3,245,121,0,960,961,3,253,125,0,961,190,1,0,0,0,962,963, + 3,267,132,0,963,964,3,263,130,0,964,965,3,269,133,0,965,966,3,255, + 126,0,966,967,3,233,115,0,967,968,3,229,113,0,968,969,3,267,132, + 0,969,970,3,237,117,0,970,192,1,0,0,0,971,972,3,267,132,0,972,973, + 3,263,130,0,973,974,3,277,137,0,974,194,1,0,0,0,975,976,3,269,133, + 0,976,977,3,255,126,0,977,978,3,231,114,0,978,979,3,257,127,0,979, + 980,3,269,133,0,980,981,3,255,126,0,981,982,3,235,116,0,982,983, + 3,237,117,0,983,984,3,235,116,0,984,196,1,0,0,0,985,986,3,269,133, + 0,986,987,3,255,126,0,987,988,3,245,121,0,988,989,3,257,127,0,989, + 990,3,255,126,0,990,198,1,0,0,0,991,992,3,269,133,0,992,993,3,265, + 131,0,993,994,3,245,121,0,994,995,3,255,126,0,995,996,3,241,119, + 0,996,200,1,0,0,0,997,998,3,273,135,0,998,999,3,237,117,0,999,1000, + 3,237,117,0,1000,1001,3,249,123,0,1001,202,1,0,0,0,1002,1003,3,273, + 135,0,1003,1004,3,243,120,0,1004,1005,3,237,117,0,1005,1006,3,255, + 126,0,1006,204,1,0,0,0,1007,1008,3,273,135,0,1008,1009,3,243,120, + 0,1009,1010,3,237,117,0,1010,1011,3,263,130,0,1011,1012,3,237,117, + 0,1012,206,1,0,0,0,1013,1014,3,273,135,0,1014,1015,3,243,120,0,1015, + 1016,3,245,121,0,1016,1017,3,251,124,0,1017,1018,3,237,117,0,1018, + 208,1,0,0,0,1019,1020,3,273,135,0,1020,1021,3,245,121,0,1021,1022, + 3,255,126,0,1022,1023,3,235,116,0,1023,1024,3,257,127,0,1024,1025, + 3,273,135,0,1025,210,1,0,0,0,1026,1027,3,273,135,0,1027,1028,3,245, + 121,0,1028,1029,3,267,132,0,1029,1030,3,243,120,0,1030,212,1,0,0, + 0,1031,1032,3,277,137,0,1032,1033,3,237,117,0,1033,1034,3,229,113, + 0,1034,1035,3,263,130,0,1035,1042,1,0,0,0,1036,1037,3,277,137,0, + 1037,1038,3,277,137,0,1038,1039,3,277,137,0,1039,1040,3,277,137, + 0,1040,1042,1,0,0,0,1041,1031,1,0,0,0,1041,1036,1,0,0,0,1042,214, + 1,0,0,0,1043,1044,3,295,146,0,1044,1045,3,231,114,0,1045,1071,1, + 0,0,0,1046,1047,3,295,146,0,1047,1048,3,239,118,0,1048,1071,1,0, + 0,0,1049,1050,3,295,146,0,1050,1051,3,263,130,0,1051,1071,1,0,0, + 0,1052,1053,3,295,146,0,1053,1054,3,255,126,0,1054,1071,1,0,0,0, + 1055,1056,3,295,146,0,1056,1057,3,267,132,0,1057,1071,1,0,0,0,1058, + 1059,3,295,146,0,1059,1060,5,48,0,0,1060,1071,1,0,0,0,1061,1062, + 3,295,146,0,1062,1063,3,229,113,0,1063,1071,1,0,0,0,1064,1065,3, + 295,146,0,1065,1066,3,271,134,0,1066,1071,1,0,0,0,1067,1068,3,295, + 146,0,1068,1069,3,295,146,0,1069,1071,1,0,0,0,1070,1043,1,0,0,0, + 1070,1046,1,0,0,0,1070,1049,1,0,0,0,1070,1052,1,0,0,0,1070,1055, + 1,0,0,0,1070,1058,1,0,0,0,1070,1061,1,0,0,0,1070,1064,1,0,0,0,1070, + 1067,1,0,0,0,1071,216,1,0,0,0,1072,1076,3,281,139,0,1073,1076,3, + 371,184,0,1074,1076,3,305,151,0,1075,1072,1,0,0,0,1075,1073,1,0, + 0,0,1075,1074,1,0,0,0,1076,1083,1,0,0,0,1077,1082,3,281,139,0,1078, + 1082,3,371,184,0,1079,1082,3,285,141,0,1080,1082,3,305,151,0,1081, + 1077,1,0,0,0,1081,1078,1,0,0,0,1081,1079,1,0,0,0,1081,1080,1,0,0, + 0,1082,1085,1,0,0,0,1083,1081,1,0,0,0,1083,1084,1,0,0,0,1084,1119, + 1,0,0,0,1085,1083,1,0,0,0,1086,1097,3,293,145,0,1087,1096,8,0,0, + 0,1088,1096,3,215,106,0,1089,1090,3,295,146,0,1090,1091,3,355,176, + 0,1091,1096,1,0,0,0,1092,1093,3,293,145,0,1093,1094,3,293,145,0, + 1094,1096,1,0,0,0,1095,1087,1,0,0,0,1095,1088,1,0,0,0,1095,1089, + 1,0,0,0,1095,1092,1,0,0,0,1096,1099,1,0,0,0,1097,1095,1,0,0,0,1097, + 1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097,1,0,0,0,1100,1101,3,293, + 145,0,1101,1119,1,0,0,0,1102,1113,3,349,173,0,1103,1112,8,1,0,0, + 1104,1112,3,215,106,0,1105,1106,3,295,146,0,1106,1107,3,349,173, + 0,1107,1112,1,0,0,0,1108,1109,3,349,173,0,1109,1110,3,349,173,0, + 1110,1112,1,0,0,0,1111,1103,1,0,0,0,1111,1104,1,0,0,0,1111,1105, + 1,0,0,0,1111,1108,1,0,0,0,1112,1115,1,0,0,0,1113,1111,1,0,0,0,1113, + 1114,1,0,0,0,1114,1116,1,0,0,0,1115,1113,1,0,0,0,1116,1117,3,349, + 173,0,1117,1119,1,0,0,0,1118,1075,1,0,0,0,1118,1086,1,0,0,0,1118, + 1102,1,0,0,0,1119,218,1,0,0,0,1120,1121,3,225,111,0,1121,1125,3, + 307,152,0,1122,1124,3,287,142,0,1123,1122,1,0,0,0,1124,1127,1,0, + 0,0,1125,1123,1,0,0,0,1125,1126,1,0,0,0,1126,1130,1,0,0,0,1127,1125, + 1,0,0,0,1128,1131,3,259,128,0,1129,1131,3,237,117,0,1130,1128,1, + 0,0,0,1130,1129,1,0,0,0,1131,1134,1,0,0,0,1132,1135,3,345,171,0, + 1133,1135,3,303,150,0,1134,1132,1,0,0,0,1134,1133,1,0,0,0,1134,1135, + 1,0,0,0,1135,1137,1,0,0,0,1136,1138,3,285,141,0,1137,1136,1,0,0, + 0,1138,1139,1,0,0,0,1139,1137,1,0,0,0,1139,1140,1,0,0,0,1140,1197, + 1,0,0,0,1141,1144,3,225,111,0,1142,1145,3,259,128,0,1143,1145,3, + 237,117,0,1144,1142,1,0,0,0,1144,1143,1,0,0,0,1145,1148,1,0,0,0, + 1146,1149,3,345,171,0,1147,1149,3,303,150,0,1148,1146,1,0,0,0,1148, + 1147,1,0,0,0,1148,1149,1,0,0,0,1149,1151,1,0,0,0,1150,1152,3,285, + 141,0,1151,1150,1,0,0,0,1152,1153,1,0,0,0,1153,1151,1,0,0,0,1153, + 1154,1,0,0,0,1154,1197,1,0,0,0,1155,1156,3,223,110,0,1156,1160,3, + 307,152,0,1157,1159,3,285,141,0,1158,1157,1,0,0,0,1159,1162,1,0, + 0,0,1160,1158,1,0,0,0,1160,1161,1,0,0,0,1161,1163,1,0,0,0,1162,1160, + 1,0,0,0,1163,1166,3,237,117,0,1164,1167,3,345,171,0,1165,1167,3, + 303,150,0,1166,1164,1,0,0,0,1166,1165,1,0,0,0,1166,1167,1,0,0,0, + 1167,1169,1,0,0,0,1168,1170,3,285,141,0,1169,1168,1,0,0,0,1170,1171, + 1,0,0,0,1171,1169,1,0,0,0,1171,1172,1,0,0,0,1172,1197,1,0,0,0,1173, + 1174,3,307,152,0,1174,1175,3,223,110,0,1175,1178,3,237,117,0,1176, + 1179,3,345,171,0,1177,1179,3,303,150,0,1178,1176,1,0,0,0,1178,1177, + 1,0,0,0,1178,1179,1,0,0,0,1179,1181,1,0,0,0,1180,1182,3,285,141, + 0,1181,1180,1,0,0,0,1182,1183,1,0,0,0,1183,1181,1,0,0,0,1183,1184, + 1,0,0,0,1184,1197,1,0,0,0,1185,1186,3,223,110,0,1186,1189,3,237, + 117,0,1187,1190,3,345,171,0,1188,1190,3,303,150,0,1189,1187,1,0, + 0,0,1189,1188,1,0,0,0,1189,1190,1,0,0,0,1190,1192,1,0,0,0,1191,1193, + 3,285,141,0,1192,1191,1,0,0,0,1193,1194,1,0,0,0,1194,1192,1,0,0, + 0,1194,1195,1,0,0,0,1195,1197,1,0,0,0,1196,1120,1,0,0,0,1196,1141, + 1,0,0,0,1196,1155,1,0,0,0,1196,1173,1,0,0,0,1196,1185,1,0,0,0,1197, + 220,1,0,0,0,1198,1200,5,48,0,0,1199,1201,3,283,140,0,1200,1199,1, + 0,0,0,1201,1202,1,0,0,0,1202,1200,1,0,0,0,1202,1203,1,0,0,0,1203, + 222,1,0,0,0,1204,1206,3,285,141,0,1205,1204,1,0,0,0,1206,1207,1, + 0,0,0,1207,1205,1,0,0,0,1207,1208,1,0,0,0,1208,224,1,0,0,0,1209, + 1210,5,48,0,0,1210,1212,3,275,136,0,1211,1213,3,287,142,0,1212,1211, + 1,0,0,0,1213,1214,1,0,0,0,1214,1212,1,0,0,0,1214,1215,1,0,0,0,1215, + 226,1,0,0,0,1216,1227,3,355,176,0,1217,1226,8,2,0,0,1218,1226,3, + 215,106,0,1219,1220,3,295,146,0,1220,1221,3,355,176,0,1221,1226, + 1,0,0,0,1222,1223,3,355,176,0,1223,1224,3,355,176,0,1224,1226,1, + 0,0,0,1225,1217,1,0,0,0,1225,1218,1,0,0,0,1225,1219,1,0,0,0,1225, + 1222,1,0,0,0,1226,1229,1,0,0,0,1227,1225,1,0,0,0,1227,1228,1,0,0, + 0,1228,1230,1,0,0,0,1229,1227,1,0,0,0,1230,1231,3,355,176,0,1231, + 228,1,0,0,0,1232,1233,7,3,0,0,1233,230,1,0,0,0,1234,1235,7,4,0,0, + 1235,232,1,0,0,0,1236,1237,7,5,0,0,1237,234,1,0,0,0,1238,1239,7, + 6,0,0,1239,236,1,0,0,0,1240,1241,7,7,0,0,1241,238,1,0,0,0,1242,1243, + 7,8,0,0,1243,240,1,0,0,0,1244,1245,7,9,0,0,1245,242,1,0,0,0,1246, + 1247,7,10,0,0,1247,244,1,0,0,0,1248,1249,7,11,0,0,1249,246,1,0,0, + 0,1250,1251,7,12,0,0,1251,248,1,0,0,0,1252,1253,7,13,0,0,1253,250, + 1,0,0,0,1254,1255,7,14,0,0,1255,252,1,0,0,0,1256,1257,7,15,0,0,1257, + 254,1,0,0,0,1258,1259,7,16,0,0,1259,256,1,0,0,0,1260,1261,7,17,0, + 0,1261,258,1,0,0,0,1262,1263,7,18,0,0,1263,260,1,0,0,0,1264,1265, + 7,19,0,0,1265,262,1,0,0,0,1266,1267,7,20,0,0,1267,264,1,0,0,0,1268, + 1269,7,21,0,0,1269,266,1,0,0,0,1270,1271,7,22,0,0,1271,268,1,0,0, + 0,1272,1273,7,23,0,0,1273,270,1,0,0,0,1274,1275,7,24,0,0,1275,272, + 1,0,0,0,1276,1277,7,25,0,0,1277,274,1,0,0,0,1278,1279,7,26,0,0,1279, + 276,1,0,0,0,1280,1281,7,27,0,0,1281,278,1,0,0,0,1282,1283,7,28,0, + 0,1283,280,1,0,0,0,1284,1285,7,29,0,0,1285,282,1,0,0,0,1286,1287, + 7,30,0,0,1287,284,1,0,0,0,1288,1289,7,31,0,0,1289,286,1,0,0,0,1290, + 1291,7,32,0,0,1291,288,1,0,0,0,1292,1293,5,45,0,0,1293,1294,5,62, + 0,0,1294,290,1,0,0,0,1295,1296,5,42,0,0,1296,292,1,0,0,0,1297,1298, + 5,96,0,0,1298,294,1,0,0,0,1299,1300,5,92,0,0,1300,296,1,0,0,0,1301, + 1302,5,58,0,0,1302,298,1,0,0,0,1303,1304,5,44,0,0,1304,300,1,0,0, + 0,1305,1306,5,124,0,0,1306,1307,5,124,0,0,1307,302,1,0,0,0,1308, + 1309,5,45,0,0,1309,304,1,0,0,0,1310,1311,5,36,0,0,1311,306,1,0,0, + 0,1312,1313,5,46,0,0,1313,308,1,0,0,0,1314,1315,5,61,0,0,1315,1316, + 5,61,0,0,1316,310,1,0,0,0,1317,1318,5,61,0,0,1318,312,1,0,0,0,1319, + 1320,5,62,0,0,1320,1321,5,61,0,0,1321,314,1,0,0,0,1322,1323,5,62, + 0,0,1323,316,1,0,0,0,1324,1325,5,35,0,0,1325,318,1,0,0,0,1326,1327, + 5,126,0,0,1327,1328,5,42,0,0,1328,320,1,0,0,0,1329,1330,5,61,0,0, + 1330,1331,5,126,0,0,1331,1332,5,42,0,0,1332,322,1,0,0,0,1333,1334, + 5,123,0,0,1334,1335,1,0,0,0,1335,1336,6,160,0,0,1336,324,1,0,0,0, + 1337,1338,5,91,0,0,1338,326,1,0,0,0,1339,1340,5,40,0,0,1340,328, + 1,0,0,0,1341,1342,5,60,0,0,1342,1343,5,61,0,0,1343,330,1,0,0,0,1344, + 1345,5,60,0,0,1345,332,1,0,0,0,1346,1347,5,33,0,0,1347,1351,5,61, + 0,0,1348,1349,5,60,0,0,1349,1351,5,62,0,0,1350,1346,1,0,0,0,1350, + 1348,1,0,0,0,1351,334,1,0,0,0,1352,1353,5,33,0,0,1353,1354,5,126, + 0,0,1354,1355,5,42,0,0,1355,336,1,0,0,0,1356,1357,5,33,0,0,1357, + 1358,5,126,0,0,1358,338,1,0,0,0,1359,1360,5,63,0,0,1360,1361,5,46, + 0,0,1361,340,1,0,0,0,1362,1363,5,63,0,0,1363,1364,5,63,0,0,1364, + 342,1,0,0,0,1365,1366,5,37,0,0,1366,344,1,0,0,0,1367,1368,5,43,0, + 0,1368,346,1,0,0,0,1369,1370,5,63,0,0,1370,348,1,0,0,0,1371,1372, + 5,34,0,0,1372,350,1,0,0,0,1373,1374,5,102,0,0,1374,1375,5,39,0,0, + 1375,1376,1,0,0,0,1376,1377,6,174,1,0,1377,352,1,0,0,0,1378,1379, + 5,70,0,0,1379,1380,5,39,0,0,1380,1381,1,0,0,0,1381,1382,6,175,2, + 0,1382,354,1,0,0,0,1383,1384,5,39,0,0,1384,356,1,0,0,0,1385,1386, + 5,126,0,0,1386,358,1,0,0,0,1387,1388,5,61,0,0,1388,1389,5,126,0, + 0,1389,360,1,0,0,0,1390,1391,5,125,0,0,1391,1392,1,0,0,0,1392,1393, + 6,179,3,0,1393,362,1,0,0,0,1394,1395,5,93,0,0,1395,364,1,0,0,0,1396, + 1397,5,41,0,0,1397,366,1,0,0,0,1398,1399,5,59,0,0,1399,368,1,0,0, + 0,1400,1401,5,47,0,0,1401,370,1,0,0,0,1402,1403,5,95,0,0,1403,372, + 1,0,0,0,1404,1405,5,47,0,0,1405,1406,5,42,0,0,1406,1410,1,0,0,0, + 1407,1409,9,0,0,0,1408,1407,1,0,0,0,1409,1412,1,0,0,0,1410,1411, + 1,0,0,0,1410,1408,1,0,0,0,1411,1413,1,0,0,0,1412,1410,1,0,0,0,1413, + 1414,5,42,0,0,1414,1415,5,47,0,0,1415,1416,1,0,0,0,1416,1417,6,185, + 4,0,1417,374,1,0,0,0,1418,1419,5,45,0,0,1419,1423,5,45,0,0,1420, + 1421,5,47,0,0,1421,1423,5,47,0,0,1422,1418,1,0,0,0,1422,1420,1,0, + 0,0,1423,1427,1,0,0,0,1424,1426,8,33,0,0,1425,1424,1,0,0,0,1426, + 1429,1,0,0,0,1427,1425,1,0,0,0,1427,1428,1,0,0,0,1428,1431,1,0,0, + 0,1429,1427,1,0,0,0,1430,1432,7,34,0,0,1431,1430,1,0,0,0,1432,1433, + 1,0,0,0,1433,1434,6,186,4,0,1434,376,1,0,0,0,1435,1436,7,35,0,0, + 1436,1437,1,0,0,0,1437,1438,6,187,5,0,1438,378,1,0,0,0,1439,1451, + 8,36,0,0,1440,1451,3,215,106,0,1441,1442,3,295,146,0,1442,1443,3, + 355,176,0,1443,1451,1,0,0,0,1444,1445,3,295,146,0,1445,1446,3,323, + 160,0,1446,1451,1,0,0,0,1447,1448,3,355,176,0,1448,1449,3,355,176, + 0,1449,1451,1,0,0,0,1450,1439,1,0,0,0,1450,1440,1,0,0,0,1450,1441, + 1,0,0,0,1450,1444,1,0,0,0,1450,1447,1,0,0,0,1451,1452,1,0,0,0,1452, + 1450,1,0,0,0,1452,1453,1,0,0,0,1453,380,1,0,0,0,1454,1455,3,323, + 160,0,1455,1456,1,0,0,0,1456,1457,6,189,0,0,1457,382,1,0,0,0,1458, + 1459,3,355,176,0,1459,1460,1,0,0,0,1460,1461,6,190,6,0,1461,1462, + 6,190,3,0,1462,384,1,0,0,0,1463,1469,8,37,0,0,1464,1469,3,215,106, + 0,1465,1466,3,295,146,0,1466,1467,3,323,160,0,1467,1469,1,0,0,0, + 1468,1463,1,0,0,0,1468,1464,1,0,0,0,1468,1465,1,0,0,0,1469,1470, + 1,0,0,0,1470,1468,1,0,0,0,1470,1471,1,0,0,0,1471,386,1,0,0,0,1472, + 1473,3,323,160,0,1473,1474,1,0,0,0,1474,1475,6,192,0,0,1475,388, + 1,0,0,0,44,0,1,2,429,657,1041,1070,1075,1081,1083,1095,1097,1111, + 1113,1118,1125,1130,1134,1139,1144,1148,1153,1160,1166,1171,1178, + 1183,1189,1194,1196,1202,1207,1214,1225,1227,1350,1410,1422,1427, + 1431,1450,1452,1468,1470,7,5,0,0,5,1,0,5,2,0,4,0,0,6,0,0,0,1,0,7, + 147,0 ] class HogQLLexer(Lexer): @@ -621,140 +630,142 @@ class HogQLLexer(Lexer): DISTINCT = 24 ELSE = 25 END = 26 - EXTRACT = 27 - FINAL = 28 - FINALLY = 29 - FIRST = 30 - FN = 31 - FOLLOWING = 32 - FOR = 33 - FROM = 34 - FULL = 35 - FUN = 36 - GROUP = 37 - HAVING = 38 - HOUR = 39 - ID = 40 - IF = 41 - ILIKE = 42 - IN = 43 - INF = 44 - INNER = 45 - INTERVAL = 46 - IS = 47 - JOIN = 48 - KEY = 49 - LAST = 50 - LEADING = 51 - LEFT = 52 - LET = 53 - LIKE = 54 - LIMIT = 55 - MINUTE = 56 - MONTH = 57 - NAN_SQL = 58 - NOT = 59 - NULL_SQL = 60 - NULLS = 61 - OFFSET = 62 - ON = 63 - OR = 64 - ORDER = 65 - OUTER = 66 - OVER = 67 - PARTITION = 68 - PRECEDING = 69 - PREWHERE = 70 - QUARTER = 71 - RANGE = 72 - RETURN = 73 - RIGHT = 74 - ROLLUP = 75 - ROW = 76 - ROWS = 77 - SAMPLE = 78 - SECOND = 79 - SELECT = 80 - SEMI = 81 - SETTINGS = 82 - SUBSTRING = 83 - THEN = 84 - THROW = 85 - TIES = 86 - TIMESTAMP = 87 - TO = 88 - TOP = 89 - TOTALS = 90 - TRAILING = 91 - TRIM = 92 - TRUNCATE = 93 - TRY = 94 - UNBOUNDED = 95 - UNION = 96 - USING = 97 - WEEK = 98 - WHEN = 99 - WHERE = 100 - WHILE = 101 - WINDOW = 102 - WITH = 103 - YEAR = 104 - ESCAPE_CHAR_COMMON = 105 - IDENTIFIER = 106 - FLOATING_LITERAL = 107 - OCTAL_LITERAL = 108 - DECIMAL_LITERAL = 109 - HEXADECIMAL_LITERAL = 110 - STRING_LITERAL = 111 - ARROW = 112 - ASTERISK = 113 - BACKQUOTE = 114 - BACKSLASH = 115 - COLON = 116 - COMMA = 117 - CONCAT = 118 - DASH = 119 - DOLLAR = 120 - DOT = 121 - EQ_DOUBLE = 122 - EQ_SINGLE = 123 - GT_EQ = 124 - GT = 125 - HASH = 126 - IREGEX_SINGLE = 127 - IREGEX_DOUBLE = 128 - LBRACE = 129 - LBRACKET = 130 - LPAREN = 131 - LT_EQ = 132 - LT = 133 - NOT_EQ = 134 - NOT_IREGEX = 135 - NOT_REGEX = 136 - NULL_PROPERTY = 137 - NULLISH = 138 - PERCENT = 139 - PLUS = 140 - QUERY = 141 - QUOTE_DOUBLE = 142 - QUOTE_SINGLE_TEMPLATE = 143 - QUOTE_SINGLE_TEMPLATE_FULL = 144 - QUOTE_SINGLE = 145 - REGEX_SINGLE = 146 - REGEX_DOUBLE = 147 - RBRACE = 148 - RBRACKET = 149 - RPAREN = 150 - SEMICOLON = 151 - SLASH = 152 - UNDERSCORE = 153 - MULTI_LINE_COMMENT = 154 - SINGLE_LINE_COMMENT = 155 - WHITESPACE = 156 - STRING_TEXT = 157 - STRING_ESCAPE_TRIGGER = 158 - FULL_STRING_TEXT = 159 - FULL_STRING_ESCAPE_TRIGGER = 160 + EXCEPT = 27 + EXTRACT = 28 + FINAL = 29 + FINALLY = 30 + FIRST = 31 + FN = 32 + FOLLOWING = 33 + FOR = 34 + FROM = 35 + FULL = 36 + FUN = 37 + GROUP = 38 + HAVING = 39 + HOUR = 40 + ID = 41 + IF = 42 + ILIKE = 43 + IN = 44 + INF = 45 + INNER = 46 + INTERSECT = 47 + INTERVAL = 48 + IS = 49 + JOIN = 50 + KEY = 51 + LAST = 52 + LEADING = 53 + LEFT = 54 + LET = 55 + LIKE = 56 + LIMIT = 57 + MINUTE = 58 + MONTH = 59 + NAN_SQL = 60 + NOT = 61 + NULL_SQL = 62 + NULLS = 63 + OFFSET = 64 + ON = 65 + OR = 66 + ORDER = 67 + OUTER = 68 + OVER = 69 + PARTITION = 70 + PRECEDING = 71 + PREWHERE = 72 + QUARTER = 73 + RANGE = 74 + RETURN = 75 + RIGHT = 76 + ROLLUP = 77 + ROW = 78 + ROWS = 79 + SAMPLE = 80 + SECOND = 81 + SELECT = 82 + SEMI = 83 + SETTINGS = 84 + SUBSTRING = 85 + THEN = 86 + THROW = 87 + TIES = 88 + TIMESTAMP = 89 + TO = 90 + TOP = 91 + TOTALS = 92 + TRAILING = 93 + TRIM = 94 + TRUNCATE = 95 + TRY = 96 + UNBOUNDED = 97 + UNION = 98 + USING = 99 + WEEK = 100 + WHEN = 101 + WHERE = 102 + WHILE = 103 + WINDOW = 104 + WITH = 105 + YEAR = 106 + ESCAPE_CHAR_COMMON = 107 + IDENTIFIER = 108 + FLOATING_LITERAL = 109 + OCTAL_LITERAL = 110 + DECIMAL_LITERAL = 111 + HEXADECIMAL_LITERAL = 112 + STRING_LITERAL = 113 + ARROW = 114 + ASTERISK = 115 + BACKQUOTE = 116 + BACKSLASH = 117 + COLON = 118 + COMMA = 119 + CONCAT = 120 + DASH = 121 + DOLLAR = 122 + DOT = 123 + EQ_DOUBLE = 124 + EQ_SINGLE = 125 + GT_EQ = 126 + GT = 127 + HASH = 128 + IREGEX_SINGLE = 129 + IREGEX_DOUBLE = 130 + LBRACE = 131 + LBRACKET = 132 + LPAREN = 133 + LT_EQ = 134 + LT = 135 + NOT_EQ = 136 + NOT_IREGEX = 137 + NOT_REGEX = 138 + NULL_PROPERTY = 139 + NULLISH = 140 + PERCENT = 141 + PLUS = 142 + QUERY = 143 + QUOTE_DOUBLE = 144 + QUOTE_SINGLE_TEMPLATE = 145 + QUOTE_SINGLE_TEMPLATE_FULL = 146 + QUOTE_SINGLE = 147 + REGEX_SINGLE = 148 + REGEX_DOUBLE = 149 + RBRACE = 150 + RBRACKET = 151 + RPAREN = 152 + SEMICOLON = 153 + SLASH = 154 + UNDERSCORE = 155 + MULTI_LINE_COMMENT = 156 + SINGLE_LINE_COMMENT = 157 + WHITESPACE = 158 + STRING_TEXT = 159 + STRING_ESCAPE_TRIGGER = 160 + FULL_STRING_TEXT = 161 + FULL_STRING_ESCAPE_TRIGGER = 162 channelNames = [ u"DEFAULT_TOKEN_CHANNEL", u"HIDDEN" ] @@ -771,64 +782,64 @@ class HogQLLexer(Lexer): "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", - "DESCENDING", "DISTINCT", "ELSE", "END", "EXTRACT", "FINAL", - "FINALLY", "FIRST", "FN", "FOLLOWING", "FOR", "FROM", "FULL", - "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", "ILIKE", "IN", - "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", "LAST", "LEADING", - "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", - "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", "RANGE", - "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", - "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", "THROW", - "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", "TRIM", - "TRUNCATE", "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", - "WHERE", "WHILE", "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", - "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", - "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", "ASTERISK", - "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", - "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", - "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", - "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", - "NULLISH", "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", - "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", - "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", - "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", - "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", "FULL_STRING_TEXT", - "FULL_STRING_ESCAPE_TRIGGER" ] + "DESCENDING", "DISTINCT", "ELSE", "END", "EXCEPT", "EXTRACT", + "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", "FOR", "FROM", + "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", "ILIKE", + "IN", "INF", "INNER", "INTERSECT", "INTERVAL", "IS", "JOIN", + "KEY", "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", "MINUTE", + "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", + "OR", "ORDER", "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", + "SAMPLE", "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", + "THEN", "THROW", "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", + "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", "UNION", + "USING", "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", + "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", + "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", + "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", + "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", + "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", + "NOT_REGEX", "NULL_PROPERTY", "NULLISH", "PERCENT", "PLUS", + "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", + "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", "RBRACKET", + "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", + "SINGLE_LINE_COMMENT", "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", + "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] ruleNames = [ "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", "DISTINCT", "ELSE", "END", - "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", "FOLLOWING", - "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", "HOUR", - "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERVAL", - "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", - "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", "NOT", - "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", "OUTER", - "OVER", "PARTITION", "PRECEDING", "PREWHERE", "QUARTER", - "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", - "SECOND", "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", - "THROW", "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", "TRAILING", - "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", "UNION", "USING", - "WEEK", "WHEN", "WHERE", "WHILE", "WINDOW", "WITH", "YEAR", - "ESCAPE_CHAR_COMMON", "IDENTIFIER", "FLOATING_LITERAL", - "OCTAL_LITERAL", "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", - "STRING_LITERAL", "A", "B", "C", "D", "E", "F", "G", "H", - "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", - "T", "U", "V", "W", "X", "Y", "Z", "LETTER", "OCT_DIGIT", - "DEC_DIGIT", "HEX_DIGIT", "ARROW", "ASTERISK", "BACKQUOTE", - "BACKSLASH", "COLON", "COMMA", "CONCAT", "DASH", "DOLLAR", - "DOT", "EQ_DOUBLE", "EQ_SINGLE", "GT_EQ", "GT", "HASH", - "IREGEX_SINGLE", "IREGEX_DOUBLE", "LBRACE", "LBRACKET", - "LPAREN", "LT_EQ", "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", - "NULL_PROPERTY", "NULLISH", "PERCENT", "PLUS", "QUERY", - "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", - "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", - "RBRACKET", "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", - "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", "WHITESPACE", - "STRING_TEXT", "STRING_ESCAPE_TRIGGER", "STRING_QUOTE_SINGLE", - "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] + "EXCEPT", "EXTRACT", "FINAL", "FINALLY", "FIRST", "FN", + "FOLLOWING", "FOR", "FROM", "FULL", "FUN", "GROUP", "HAVING", + "HOUR", "ID", "IF", "ILIKE", "IN", "INF", "INNER", "INTERSECT", + "INTERVAL", "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", + "LET", "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", + "NOT", "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", + "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", + "ROWS", "SAMPLE", "SECOND", "SELECT", "SEMI", "SETTINGS", + "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", "TO", + "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", "TRY", + "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", "WHERE", + "WHILE", "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", + "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", + "HEXADECIMAL_LITERAL", "STRING_LITERAL", "A", "B", "C", + "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", + "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", + "Z", "LETTER", "OCT_DIGIT", "DEC_DIGIT", "HEX_DIGIT", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", + "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", + "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", + "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", + "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", "NULLISH", + "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", + "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", + "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", + "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", + "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", + "STRING_QUOTE_SINGLE", "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] grammarFileName = "HogQLLexer.g4" diff --git a/posthog/hogql/grammar/HogQLLexer.tokens b/posthog/hogql/grammar/HogQLLexer.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/posthog/hogql/grammar/HogQLLexer.tokens +++ b/posthog/hogql/grammar/HogQLLexer.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/posthog/hogql/grammar/HogQLParser.g4 b/posthog/hogql/grammar/HogQLParser.g4 index ecc89c4eb5543..7f0e482e31498 100644 --- a/posthog/hogql/grammar/HogQLParser.g4 +++ b/posthog/hogql/grammar/HogQLParser.g4 @@ -51,10 +51,12 @@ kvPairList: kvPair (COMMA kvPair)* COMMA?; // SELECT statement -select: (selectUnionStmt | selectStmt | hogqlxTagElement) EOF; +select: (selectSetStmt | selectStmt | hogqlxTagElement) EOF; -selectUnionStmt: selectStmtWithParens (UNION ALL selectStmtWithParens)*; -selectStmtWithParens: selectStmt | LPAREN selectUnionStmt RPAREN | placeholder; +selectStmtWithParens: selectStmt | LPAREN selectSetStmt RPAREN | placeholder; + +subsequentSelectSetClause: (EXCEPT | UNION ALL | INTERSECT) selectStmtWithParens; +selectSetStmt: selectStmtWithParens (subsequentSelectSetClause)*; selectStmt: with=withClause? @@ -201,7 +203,7 @@ columnExpr | columnExpr QUERY columnExpr COLON columnExpr # ColumnExprTernaryOp | columnExpr (AS identifier | AS STRING_LITERAL) # ColumnExprAlias | (tableIdentifier DOT)? ASTERISK # ColumnExprAsterisk // single-column only - | LPAREN selectUnionStmt RPAREN # ColumnExprSubquery // single-column only + | LPAREN selectSetStmt RPAREN # ColumnExprSubquery // single-column only | LPAREN columnExpr RPAREN # ColumnExprParens // single-column only | LPAREN columnExprList RPAREN # ColumnExprTuple | LBRACKET columnExprList? RBRACKET # ColumnExprArray @@ -231,7 +233,7 @@ hogqlxTagAttribute withExprList: withExpr (COMMA withExpr)* COMMA?; withExpr - : identifier AS LPAREN selectUnionStmt RPAREN # WithExprSubquery + : identifier AS LPAREN selectSetStmt RPAREN # WithExprSubquery // NOTE: asterisk and subquery goes before |columnExpr| so that we can mark them as multi-column expressions. | columnExpr AS identifier # WithExprColumn ; @@ -246,7 +248,7 @@ nestedIdentifier: identifier (DOT identifier)*; tableExpr : tableIdentifier # TableExprIdentifier | tableFunctionExpr # TableExprFunction - | LPAREN selectUnionStmt RPAREN # TableExprSubquery + | LPAREN selectSetStmt RPAREN # TableExprSubquery | tableExpr (alias | AS identifier) # TableExprAlias | hogqlxTagElement # TableExprTag | placeholder # TableExprPlaceholder diff --git a/posthog/hogql/grammar/HogQLParser.interp b/posthog/hogql/grammar/HogQLParser.interp index 86b5777f1ff22..4308ee42ae9b9 100644 --- a/posthog/hogql/grammar/HogQLParser.interp +++ b/posthog/hogql/grammar/HogQLParser.interp @@ -111,6 +111,8 @@ null null null null +null +null '->' '*' '`' @@ -189,6 +191,7 @@ DESCENDING DISTINCT ELSE END +EXCEPT EXTRACT FINAL FINALLY @@ -208,6 +211,7 @@ ILIKE IN INF INNER +INTERSECT INTERVAL IS JOIN @@ -347,8 +351,9 @@ block kvPair kvPairList select -selectUnionStmt selectStmtWithParens +subsequentSelectSetClause +selectSetStmt selectStmt withClause topClause @@ -414,4 +419,4 @@ stringContentsFull atn: -[4, 1, 160, 1303, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 1, 0, 5, 0, 174, 8, 0, 10, 0, 12, 0, 177, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 183, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 192, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 197, 8, 4, 10, 4, 12, 4, 200, 9, 4, 1, 4, 3, 4, 203, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 217, 8, 5, 1, 6, 1, 6, 3, 6, 221, 8, 6, 1, 6, 3, 6, 224, 8, 6, 1, 7, 1, 7, 3, 7, 228, 8, 7, 1, 7, 3, 7, 231, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 238, 8, 8, 1, 8, 1, 8, 3, 8, 242, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 249, 8, 9, 10, 9, 12, 9, 252, 9, 9, 1, 9, 1, 9, 3, 9, 256, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 265, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 273, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 280, 8, 12, 1, 12, 1, 12, 3, 12, 284, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 290, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 295, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 303, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 310, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 316, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 328, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 334, 8, 18, 10, 18, 12, 18, 337, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 348, 8, 20, 10, 20, 12, 20, 351, 9, 20, 1, 20, 3, 20, 354, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 359, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 5, 22, 367, 8, 22, 10, 22, 12, 22, 370, 9, 22, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 378, 8, 23, 1, 24, 3, 24, 381, 8, 24, 1, 24, 1, 24, 3, 24, 385, 8, 24, 1, 24, 3, 24, 388, 8, 24, 1, 24, 1, 24, 3, 24, 392, 8, 24, 1, 24, 3, 24, 395, 8, 24, 1, 24, 3, 24, 398, 8, 24, 1, 24, 3, 24, 401, 8, 24, 1, 24, 3, 24, 404, 8, 24, 1, 24, 1, 24, 3, 24, 408, 8, 24, 1, 24, 1, 24, 3, 24, 412, 8, 24, 1, 24, 3, 24, 415, 8, 24, 1, 24, 3, 24, 418, 8, 24, 1, 24, 3, 24, 421, 8, 24, 1, 24, 1, 24, 3, 24, 425, 8, 24, 1, 24, 3, 24, 428, 8, 24, 1, 25, 1, 25, 1, 25, 1, 26, 1, 26, 1, 26, 1, 26, 3, 26, 437, 8, 26, 1, 27, 1, 27, 1, 27, 1, 28, 3, 28, 443, 8, 28, 1, 28, 1, 28, 1, 28, 1, 28, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 29, 5, 29, 462, 8, 29, 10, 29, 12, 29, 465, 9, 29, 1, 30, 1, 30, 1, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 1, 32, 3, 32, 481, 8, 32, 1, 33, 1, 33, 1, 33, 1, 34, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 498, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 504, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 510, 8, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 1, 36, 3, 36, 521, 8, 36, 3, 36, 523, 8, 36, 1, 37, 1, 37, 1, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 3, 39, 534, 8, 39, 1, 39, 3, 39, 537, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 543, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 1, 39, 3, 39, 551, 8, 39, 1, 39, 1, 39, 1, 39, 1, 39, 5, 39, 557, 8, 39, 10, 39, 12, 39, 560, 9, 39, 1, 40, 3, 40, 563, 8, 40, 1, 40, 1, 40, 1, 40, 3, 40, 568, 8, 40, 1, 40, 3, 40, 571, 8, 40, 1, 40, 3, 40, 574, 8, 40, 1, 40, 1, 40, 3, 40, 578, 8, 40, 1, 40, 1, 40, 3, 40, 582, 8, 40, 1, 40, 3, 40, 585, 8, 40, 3, 40, 587, 8, 40, 1, 40, 3, 40, 590, 8, 40, 1, 40, 1, 40, 3, 40, 594, 8, 40, 1, 40, 1, 40, 3, 40, 598, 8, 40, 1, 40, 3, 40, 601, 8, 40, 3, 40, 603, 8, 40, 3, 40, 605, 8, 40, 1, 41, 1, 41, 1, 41, 3, 41, 610, 8, 41, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 1, 42, 3, 42, 621, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 627, 8, 43, 1, 44, 1, 44, 1, 44, 5, 44, 632, 8, 44, 10, 44, 12, 44, 635, 9, 44, 1, 45, 1, 45, 3, 45, 639, 8, 45, 1, 45, 1, 45, 3, 45, 643, 8, 45, 1, 45, 1, 45, 3, 45, 647, 8, 45, 1, 46, 1, 46, 1, 46, 1, 46, 3, 46, 653, 8, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 5, 47, 660, 8, 47, 10, 47, 12, 47, 663, 9, 47, 1, 48, 1, 48, 1, 48, 1, 48, 1, 49, 3, 49, 670, 8, 49, 1, 49, 3, 49, 673, 8, 49, 1, 49, 3, 49, 676, 8, 49, 1, 50, 1, 50, 1, 50, 1, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 1, 53, 3, 53, 695, 8, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 709, 8, 54, 1, 55, 1, 55, 1, 55, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 723, 8, 56, 10, 56, 12, 56, 726, 9, 56, 1, 56, 3, 56, 729, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 738, 8, 56, 10, 56, 12, 56, 741, 9, 56, 1, 56, 3, 56, 744, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 5, 56, 753, 8, 56, 10, 56, 12, 56, 756, 9, 56, 1, 56, 3, 56, 759, 8, 56, 1, 56, 1, 56, 1, 56, 1, 56, 1, 56, 3, 56, 766, 8, 56, 1, 56, 1, 56, 3, 56, 770, 8, 56, 1, 57, 1, 57, 1, 57, 5, 57, 775, 8, 57, 10, 57, 12, 57, 778, 9, 57, 1, 57, 3, 57, 781, 8, 57, 1, 58, 1, 58, 1, 58, 3, 58, 786, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 4, 58, 793, 8, 58, 11, 58, 12, 58, 794, 1, 58, 1, 58, 3, 58, 799, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 823, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 840, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 846, 8, 58, 1, 58, 3, 58, 849, 8, 58, 1, 58, 3, 58, 852, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 862, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 868, 8, 58, 1, 58, 3, 58, 871, 8, 58, 1, 58, 3, 58, 874, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 882, 8, 58, 1, 58, 3, 58, 885, 8, 58, 1, 58, 1, 58, 3, 58, 889, 8, 58, 1, 58, 3, 58, 892, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 906, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 923, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 928, 8, 58, 1, 58, 1, 58, 1, 58, 3, 58, 933, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 939, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 946, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 958, 8, 58, 1, 58, 1, 58, 3, 58, 962, 8, 58, 1, 58, 3, 58, 965, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 974, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 988, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1004, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1033, 8, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 1, 58, 3, 58, 1041, 8, 58, 5, 58, 1043, 8, 58, 10, 58, 12, 58, 1046, 9, 58, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1052, 8, 59, 10, 59, 12, 59, 1055, 9, 59, 1, 59, 3, 59, 1058, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 5, 59, 1065, 8, 59, 10, 59, 12, 59, 1068, 9, 59, 1, 59, 3, 59, 1071, 8, 59, 1, 59, 1, 59, 3, 59, 1075, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1080, 8, 59, 1, 60, 1, 60, 1, 60, 5, 60, 1085, 8, 60, 10, 60, 12, 60, 1088, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1096, 8, 60, 10, 60, 12, 60, 1099, 9, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1107, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1114, 8, 60, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1127, 8, 61, 1, 62, 1, 62, 1, 62, 5, 62, 1132, 8, 62, 10, 62, 12, 62, 1135, 9, 62, 1, 62, 3, 62, 1138, 8, 62, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 1, 63, 3, 63, 1150, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1156, 8, 64, 1, 64, 3, 64, 1159, 8, 64, 1, 65, 1, 65, 1, 65, 5, 65, 1164, 8, 65, 10, 65, 12, 65, 1167, 9, 65, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1178, 8, 66, 1, 66, 1, 66, 1, 66, 1, 66, 3, 66, 1184, 8, 66, 5, 66, 1186, 8, 66, 10, 66, 12, 66, 1189, 9, 66, 1, 67, 1, 67, 1, 67, 3, 67, 1194, 8, 67, 1, 67, 1, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1201, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 5, 69, 1208, 8, 69, 10, 69, 12, 69, 1211, 9, 69, 1, 69, 3, 69, 1214, 8, 69, 1, 70, 1, 70, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 1, 71, 3, 71, 1224, 8, 71, 3, 71, 1226, 8, 71, 1, 72, 3, 72, 1229, 8, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1237, 8, 72, 1, 73, 1, 73, 1, 73, 3, 73, 1242, 8, 73, 1, 74, 1, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 3, 77, 1252, 8, 77, 1, 78, 1, 78, 1, 78, 3, 78, 1257, 8, 78, 1, 79, 1, 79, 1, 79, 1, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 3, 81, 1269, 8, 81, 1, 82, 1, 82, 5, 82, 1273, 8, 82, 10, 82, 12, 82, 1276, 9, 82, 1, 82, 1, 82, 1, 83, 1, 83, 1, 83, 1, 83, 1, 83, 3, 83, 1285, 8, 83, 1, 84, 1, 84, 5, 84, 1289, 8, 84, 10, 84, 12, 84, 1292, 9, 84, 1, 84, 1, 84, 1, 85, 1, 85, 1, 85, 1, 85, 1, 85, 3, 85, 1301, 8, 85, 1, 85, 0, 3, 78, 116, 132, 86, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 0, 17, 2, 0, 31, 31, 36, 36, 2, 0, 18, 18, 75, 75, 2, 0, 45, 45, 52, 52, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 81, 81, 2, 0, 52, 52, 74, 74, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 30, 30, 50, 50, 2, 0, 72, 72, 77, 77, 3, 0, 10, 10, 51, 51, 91, 91, 2, 0, 42, 42, 54, 54, 1, 0, 108, 109, 2, 0, 119, 119, 140, 140, 7, 0, 21, 21, 39, 39, 56, 57, 71, 71, 79, 79, 98, 98, 104, 104, 17, 0, 1, 13, 15, 20, 22, 28, 30, 30, 32, 35, 37, 38, 40, 43, 45, 52, 54, 55, 59, 59, 61, 70, 72, 78, 80, 84, 86, 93, 95, 97, 99, 100, 102, 103, 4, 0, 20, 20, 30, 30, 40, 40, 49, 49, 1475, 0, 175, 1, 0, 0, 0, 2, 182, 1, 0, 0, 0, 4, 184, 1, 0, 0, 0, 6, 186, 1, 0, 0, 0, 8, 193, 1, 0, 0, 0, 10, 216, 1, 0, 0, 0, 12, 218, 1, 0, 0, 0, 14, 225, 1, 0, 0, 0, 16, 232, 1, 0, 0, 0, 18, 245, 1, 0, 0, 0, 20, 257, 1, 0, 0, 0, 22, 266, 1, 0, 0, 0, 24, 274, 1, 0, 0, 0, 26, 296, 1, 0, 0, 0, 28, 311, 1, 0, 0, 0, 30, 320, 1, 0, 0, 0, 32, 325, 1, 0, 0, 0, 34, 329, 1, 0, 0, 0, 36, 331, 1, 0, 0, 0, 38, 340, 1, 0, 0, 0, 40, 344, 1, 0, 0, 0, 42, 358, 1, 0, 0, 0, 44, 362, 1, 0, 0, 0, 46, 377, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 429, 1, 0, 0, 0, 52, 432, 1, 0, 0, 0, 54, 438, 1, 0, 0, 0, 56, 442, 1, 0, 0, 0, 58, 448, 1, 0, 0, 0, 60, 466, 1, 0, 0, 0, 62, 469, 1, 0, 0, 0, 64, 472, 1, 0, 0, 0, 66, 482, 1, 0, 0, 0, 68, 485, 1, 0, 0, 0, 70, 489, 1, 0, 0, 0, 72, 522, 1, 0, 0, 0, 74, 524, 1, 0, 0, 0, 76, 527, 1, 0, 0, 0, 78, 542, 1, 0, 0, 0, 80, 604, 1, 0, 0, 0, 82, 609, 1, 0, 0, 0, 84, 620, 1, 0, 0, 0, 86, 622, 1, 0, 0, 0, 88, 628, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 654, 1, 0, 0, 0, 94, 656, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 669, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 681, 1, 0, 0, 0, 104, 685, 1, 0, 0, 0, 106, 694, 1, 0, 0, 0, 108, 708, 1, 0, 0, 0, 110, 710, 1, 0, 0, 0, 112, 769, 1, 0, 0, 0, 114, 771, 1, 0, 0, 0, 116, 932, 1, 0, 0, 0, 118, 1074, 1, 0, 0, 0, 120, 1113, 1, 0, 0, 0, 122, 1126, 1, 0, 0, 0, 124, 1128, 1, 0, 0, 0, 126, 1149, 1, 0, 0, 0, 128, 1158, 1, 0, 0, 0, 130, 1160, 1, 0, 0, 0, 132, 1177, 1, 0, 0, 0, 134, 1190, 1, 0, 0, 0, 136, 1200, 1, 0, 0, 0, 138, 1204, 1, 0, 0, 0, 140, 1215, 1, 0, 0, 0, 142, 1225, 1, 0, 0, 0, 144, 1228, 1, 0, 0, 0, 146, 1241, 1, 0, 0, 0, 148, 1243, 1, 0, 0, 0, 150, 1245, 1, 0, 0, 0, 152, 1247, 1, 0, 0, 0, 154, 1251, 1, 0, 0, 0, 156, 1256, 1, 0, 0, 0, 158, 1258, 1, 0, 0, 0, 160, 1262, 1, 0, 0, 0, 162, 1268, 1, 0, 0, 0, 164, 1270, 1, 0, 0, 0, 166, 1284, 1, 0, 0, 0, 168, 1286, 1, 0, 0, 0, 170, 1300, 1, 0, 0, 0, 172, 174, 3, 2, 1, 0, 173, 172, 1, 0, 0, 0, 174, 177, 1, 0, 0, 0, 175, 173, 1, 0, 0, 0, 175, 176, 1, 0, 0, 0, 176, 178, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 178, 179, 5, 0, 0, 1, 179, 1, 1, 0, 0, 0, 180, 183, 3, 6, 3, 0, 181, 183, 3, 10, 5, 0, 182, 180, 1, 0, 0, 0, 182, 181, 1, 0, 0, 0, 183, 3, 1, 0, 0, 0, 184, 185, 3, 116, 58, 0, 185, 5, 1, 0, 0, 0, 186, 187, 5, 53, 0, 0, 187, 191, 3, 156, 78, 0, 188, 189, 5, 116, 0, 0, 189, 190, 5, 123, 0, 0, 190, 192, 3, 4, 2, 0, 191, 188, 1, 0, 0, 0, 191, 192, 1, 0, 0, 0, 192, 7, 1, 0, 0, 0, 193, 198, 3, 156, 78, 0, 194, 195, 5, 117, 0, 0, 195, 197, 3, 156, 78, 0, 196, 194, 1, 0, 0, 0, 197, 200, 1, 0, 0, 0, 198, 196, 1, 0, 0, 0, 198, 199, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 201, 203, 5, 117, 0, 0, 202, 201, 1, 0, 0, 0, 202, 203, 1, 0, 0, 0, 203, 9, 1, 0, 0, 0, 204, 217, 3, 12, 6, 0, 205, 217, 3, 14, 7, 0, 206, 217, 3, 18, 9, 0, 207, 217, 3, 20, 10, 0, 208, 217, 3, 22, 11, 0, 209, 217, 3, 26, 13, 0, 210, 217, 3, 24, 12, 0, 211, 217, 3, 28, 14, 0, 212, 217, 3, 30, 15, 0, 213, 217, 3, 36, 18, 0, 214, 217, 3, 32, 16, 0, 215, 217, 3, 34, 17, 0, 216, 204, 1, 0, 0, 0, 216, 205, 1, 0, 0, 0, 216, 206, 1, 0, 0, 0, 216, 207, 1, 0, 0, 0, 216, 208, 1, 0, 0, 0, 216, 209, 1, 0, 0, 0, 216, 210, 1, 0, 0, 0, 216, 211, 1, 0, 0, 0, 216, 212, 1, 0, 0, 0, 216, 213, 1, 0, 0, 0, 216, 214, 1, 0, 0, 0, 216, 215, 1, 0, 0, 0, 217, 11, 1, 0, 0, 0, 218, 220, 5, 73, 0, 0, 219, 221, 3, 4, 2, 0, 220, 219, 1, 0, 0, 0, 220, 221, 1, 0, 0, 0, 221, 223, 1, 0, 0, 0, 222, 224, 5, 151, 0, 0, 223, 222, 1, 0, 0, 0, 223, 224, 1, 0, 0, 0, 224, 13, 1, 0, 0, 0, 225, 227, 5, 85, 0, 0, 226, 228, 3, 4, 2, 0, 227, 226, 1, 0, 0, 0, 227, 228, 1, 0, 0, 0, 228, 230, 1, 0, 0, 0, 229, 231, 5, 151, 0, 0, 230, 229, 1, 0, 0, 0, 230, 231, 1, 0, 0, 0, 231, 15, 1, 0, 0, 0, 232, 241, 5, 14, 0, 0, 233, 234, 5, 131, 0, 0, 234, 237, 3, 156, 78, 0, 235, 236, 5, 116, 0, 0, 236, 238, 3, 156, 78, 0, 237, 235, 1, 0, 0, 0, 237, 238, 1, 0, 0, 0, 238, 239, 1, 0, 0, 0, 239, 240, 5, 150, 0, 0, 240, 242, 1, 0, 0, 0, 241, 233, 1, 0, 0, 0, 241, 242, 1, 0, 0, 0, 242, 243, 1, 0, 0, 0, 243, 244, 3, 36, 18, 0, 244, 17, 1, 0, 0, 0, 245, 246, 5, 94, 0, 0, 246, 250, 3, 36, 18, 0, 247, 249, 3, 16, 8, 0, 248, 247, 1, 0, 0, 0, 249, 252, 1, 0, 0, 0, 250, 248, 1, 0, 0, 0, 250, 251, 1, 0, 0, 0, 251, 255, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 253, 254, 5, 29, 0, 0, 254, 256, 3, 36, 18, 0, 255, 253, 1, 0, 0, 0, 255, 256, 1, 0, 0, 0, 256, 19, 1, 0, 0, 0, 257, 258, 5, 41, 0, 0, 258, 259, 5, 131, 0, 0, 259, 260, 3, 4, 2, 0, 260, 261, 5, 150, 0, 0, 261, 264, 3, 10, 5, 0, 262, 263, 5, 25, 0, 0, 263, 265, 3, 10, 5, 0, 264, 262, 1, 0, 0, 0, 264, 265, 1, 0, 0, 0, 265, 21, 1, 0, 0, 0, 266, 267, 5, 101, 0, 0, 267, 268, 5, 131, 0, 0, 268, 269, 3, 4, 2, 0, 269, 270, 5, 150, 0, 0, 270, 272, 3, 10, 5, 0, 271, 273, 5, 151, 0, 0, 272, 271, 1, 0, 0, 0, 272, 273, 1, 0, 0, 0, 273, 23, 1, 0, 0, 0, 274, 275, 5, 33, 0, 0, 275, 279, 5, 131, 0, 0, 276, 280, 3, 6, 3, 0, 277, 280, 3, 30, 15, 0, 278, 280, 3, 4, 2, 0, 279, 276, 1, 0, 0, 0, 279, 277, 1, 0, 0, 0, 279, 278, 1, 0, 0, 0, 279, 280, 1, 0, 0, 0, 280, 281, 1, 0, 0, 0, 281, 283, 5, 151, 0, 0, 282, 284, 3, 4, 2, 0, 283, 282, 1, 0, 0, 0, 283, 284, 1, 0, 0, 0, 284, 285, 1, 0, 0, 0, 285, 289, 5, 151, 0, 0, 286, 290, 3, 6, 3, 0, 287, 290, 3, 30, 15, 0, 288, 290, 3, 4, 2, 0, 289, 286, 1, 0, 0, 0, 289, 287, 1, 0, 0, 0, 289, 288, 1, 0, 0, 0, 289, 290, 1, 0, 0, 0, 290, 291, 1, 0, 0, 0, 291, 292, 5, 150, 0, 0, 292, 294, 3, 10, 5, 0, 293, 295, 5, 151, 0, 0, 294, 293, 1, 0, 0, 0, 294, 295, 1, 0, 0, 0, 295, 25, 1, 0, 0, 0, 296, 297, 5, 33, 0, 0, 297, 298, 5, 131, 0, 0, 298, 299, 5, 53, 0, 0, 299, 302, 3, 156, 78, 0, 300, 301, 5, 117, 0, 0, 301, 303, 3, 156, 78, 0, 302, 300, 1, 0, 0, 0, 302, 303, 1, 0, 0, 0, 303, 304, 1, 0, 0, 0, 304, 305, 5, 43, 0, 0, 305, 306, 3, 4, 2, 0, 306, 307, 5, 150, 0, 0, 307, 309, 3, 10, 5, 0, 308, 310, 5, 151, 0, 0, 309, 308, 1, 0, 0, 0, 309, 310, 1, 0, 0, 0, 310, 27, 1, 0, 0, 0, 311, 312, 7, 0, 0, 0, 312, 313, 3, 156, 78, 0, 313, 315, 5, 131, 0, 0, 314, 316, 3, 8, 4, 0, 315, 314, 1, 0, 0, 0, 315, 316, 1, 0, 0, 0, 316, 317, 1, 0, 0, 0, 317, 318, 5, 150, 0, 0, 318, 319, 3, 36, 18, 0, 319, 29, 1, 0, 0, 0, 320, 321, 3, 4, 2, 0, 321, 322, 5, 116, 0, 0, 322, 323, 5, 123, 0, 0, 323, 324, 3, 4, 2, 0, 324, 31, 1, 0, 0, 0, 325, 327, 3, 4, 2, 0, 326, 328, 5, 151, 0, 0, 327, 326, 1, 0, 0, 0, 327, 328, 1, 0, 0, 0, 328, 33, 1, 0, 0, 0, 329, 330, 5, 151, 0, 0, 330, 35, 1, 0, 0, 0, 331, 335, 5, 129, 0, 0, 332, 334, 3, 2, 1, 0, 333, 332, 1, 0, 0, 0, 334, 337, 1, 0, 0, 0, 335, 333, 1, 0, 0, 0, 335, 336, 1, 0, 0, 0, 336, 338, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 338, 339, 5, 148, 0, 0, 339, 37, 1, 0, 0, 0, 340, 341, 3, 4, 2, 0, 341, 342, 5, 116, 0, 0, 342, 343, 3, 4, 2, 0, 343, 39, 1, 0, 0, 0, 344, 349, 3, 38, 19, 0, 345, 346, 5, 117, 0, 0, 346, 348, 3, 38, 19, 0, 347, 345, 1, 0, 0, 0, 348, 351, 1, 0, 0, 0, 349, 347, 1, 0, 0, 0, 349, 350, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 352, 354, 5, 117, 0, 0, 353, 352, 1, 0, 0, 0, 353, 354, 1, 0, 0, 0, 354, 41, 1, 0, 0, 0, 355, 359, 3, 44, 22, 0, 356, 359, 3, 48, 24, 0, 357, 359, 3, 120, 60, 0, 358, 355, 1, 0, 0, 0, 358, 356, 1, 0, 0, 0, 358, 357, 1, 0, 0, 0, 359, 360, 1, 0, 0, 0, 360, 361, 5, 0, 0, 1, 361, 43, 1, 0, 0, 0, 362, 368, 3, 46, 23, 0, 363, 364, 5, 96, 0, 0, 364, 365, 5, 1, 0, 0, 365, 367, 3, 46, 23, 0, 366, 363, 1, 0, 0, 0, 367, 370, 1, 0, 0, 0, 368, 366, 1, 0, 0, 0, 368, 369, 1, 0, 0, 0, 369, 45, 1, 0, 0, 0, 370, 368, 1, 0, 0, 0, 371, 378, 3, 48, 24, 0, 372, 373, 5, 131, 0, 0, 373, 374, 3, 44, 22, 0, 374, 375, 5, 150, 0, 0, 375, 378, 1, 0, 0, 0, 376, 378, 3, 160, 80, 0, 377, 371, 1, 0, 0, 0, 377, 372, 1, 0, 0, 0, 377, 376, 1, 0, 0, 0, 378, 47, 1, 0, 0, 0, 379, 381, 3, 50, 25, 0, 380, 379, 1, 0, 0, 0, 380, 381, 1, 0, 0, 0, 381, 382, 1, 0, 0, 0, 382, 384, 5, 80, 0, 0, 383, 385, 5, 24, 0, 0, 384, 383, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 387, 1, 0, 0, 0, 386, 388, 3, 52, 26, 0, 387, 386, 1, 0, 0, 0, 387, 388, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 391, 3, 114, 57, 0, 390, 392, 3, 54, 27, 0, 391, 390, 1, 0, 0, 0, 391, 392, 1, 0, 0, 0, 392, 394, 1, 0, 0, 0, 393, 395, 3, 56, 28, 0, 394, 393, 1, 0, 0, 0, 394, 395, 1, 0, 0, 0, 395, 397, 1, 0, 0, 0, 396, 398, 3, 60, 30, 0, 397, 396, 1, 0, 0, 0, 397, 398, 1, 0, 0, 0, 398, 400, 1, 0, 0, 0, 399, 401, 3, 62, 31, 0, 400, 399, 1, 0, 0, 0, 400, 401, 1, 0, 0, 0, 401, 403, 1, 0, 0, 0, 402, 404, 3, 64, 32, 0, 403, 402, 1, 0, 0, 0, 403, 404, 1, 0, 0, 0, 404, 407, 1, 0, 0, 0, 405, 406, 5, 103, 0, 0, 406, 408, 7, 1, 0, 0, 407, 405, 1, 0, 0, 0, 407, 408, 1, 0, 0, 0, 408, 411, 1, 0, 0, 0, 409, 410, 5, 103, 0, 0, 410, 412, 5, 90, 0, 0, 411, 409, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 414, 1, 0, 0, 0, 413, 415, 3, 66, 33, 0, 414, 413, 1, 0, 0, 0, 414, 415, 1, 0, 0, 0, 415, 417, 1, 0, 0, 0, 416, 418, 3, 58, 29, 0, 417, 416, 1, 0, 0, 0, 417, 418, 1, 0, 0, 0, 418, 420, 1, 0, 0, 0, 419, 421, 3, 68, 34, 0, 420, 419, 1, 0, 0, 0, 420, 421, 1, 0, 0, 0, 421, 424, 1, 0, 0, 0, 422, 425, 3, 72, 36, 0, 423, 425, 3, 74, 37, 0, 424, 422, 1, 0, 0, 0, 424, 423, 1, 0, 0, 0, 424, 425, 1, 0, 0, 0, 425, 427, 1, 0, 0, 0, 426, 428, 3, 76, 38, 0, 427, 426, 1, 0, 0, 0, 427, 428, 1, 0, 0, 0, 428, 49, 1, 0, 0, 0, 429, 430, 5, 103, 0, 0, 430, 431, 3, 124, 62, 0, 431, 51, 1, 0, 0, 0, 432, 433, 5, 89, 0, 0, 433, 436, 5, 109, 0, 0, 434, 435, 5, 103, 0, 0, 435, 437, 5, 86, 0, 0, 436, 434, 1, 0, 0, 0, 436, 437, 1, 0, 0, 0, 437, 53, 1, 0, 0, 0, 438, 439, 5, 34, 0, 0, 439, 440, 3, 78, 39, 0, 440, 55, 1, 0, 0, 0, 441, 443, 7, 2, 0, 0, 442, 441, 1, 0, 0, 0, 442, 443, 1, 0, 0, 0, 443, 444, 1, 0, 0, 0, 444, 445, 5, 5, 0, 0, 445, 446, 5, 48, 0, 0, 446, 447, 3, 114, 57, 0, 447, 57, 1, 0, 0, 0, 448, 449, 5, 102, 0, 0, 449, 450, 3, 156, 78, 0, 450, 451, 5, 6, 0, 0, 451, 452, 5, 131, 0, 0, 452, 453, 3, 98, 49, 0, 453, 463, 5, 150, 0, 0, 454, 455, 5, 117, 0, 0, 455, 456, 3, 156, 78, 0, 456, 457, 5, 6, 0, 0, 457, 458, 5, 131, 0, 0, 458, 459, 3, 98, 49, 0, 459, 460, 5, 150, 0, 0, 460, 462, 1, 0, 0, 0, 461, 454, 1, 0, 0, 0, 462, 465, 1, 0, 0, 0, 463, 461, 1, 0, 0, 0, 463, 464, 1, 0, 0, 0, 464, 59, 1, 0, 0, 0, 465, 463, 1, 0, 0, 0, 466, 467, 5, 70, 0, 0, 467, 468, 3, 116, 58, 0, 468, 61, 1, 0, 0, 0, 469, 470, 5, 100, 0, 0, 470, 471, 3, 116, 58, 0, 471, 63, 1, 0, 0, 0, 472, 473, 5, 37, 0, 0, 473, 480, 5, 11, 0, 0, 474, 475, 7, 1, 0, 0, 475, 476, 5, 131, 0, 0, 476, 477, 3, 114, 57, 0, 477, 478, 5, 150, 0, 0, 478, 481, 1, 0, 0, 0, 479, 481, 3, 114, 57, 0, 480, 474, 1, 0, 0, 0, 480, 479, 1, 0, 0, 0, 481, 65, 1, 0, 0, 0, 482, 483, 5, 38, 0, 0, 483, 484, 3, 116, 58, 0, 484, 67, 1, 0, 0, 0, 485, 486, 5, 65, 0, 0, 486, 487, 5, 11, 0, 0, 487, 488, 3, 88, 44, 0, 488, 69, 1, 0, 0, 0, 489, 490, 5, 65, 0, 0, 490, 491, 5, 11, 0, 0, 491, 492, 3, 114, 57, 0, 492, 71, 1, 0, 0, 0, 493, 494, 5, 55, 0, 0, 494, 497, 3, 116, 58, 0, 495, 496, 5, 117, 0, 0, 496, 498, 3, 116, 58, 0, 497, 495, 1, 0, 0, 0, 497, 498, 1, 0, 0, 0, 498, 503, 1, 0, 0, 0, 499, 500, 5, 103, 0, 0, 500, 504, 5, 86, 0, 0, 501, 502, 5, 11, 0, 0, 502, 504, 3, 114, 57, 0, 503, 499, 1, 0, 0, 0, 503, 501, 1, 0, 0, 0, 503, 504, 1, 0, 0, 0, 504, 523, 1, 0, 0, 0, 505, 506, 5, 55, 0, 0, 506, 509, 3, 116, 58, 0, 507, 508, 5, 103, 0, 0, 508, 510, 5, 86, 0, 0, 509, 507, 1, 0, 0, 0, 509, 510, 1, 0, 0, 0, 510, 511, 1, 0, 0, 0, 511, 512, 5, 62, 0, 0, 512, 513, 3, 116, 58, 0, 513, 523, 1, 0, 0, 0, 514, 515, 5, 55, 0, 0, 515, 516, 3, 116, 58, 0, 516, 517, 5, 62, 0, 0, 517, 520, 3, 116, 58, 0, 518, 519, 5, 11, 0, 0, 519, 521, 3, 114, 57, 0, 520, 518, 1, 0, 0, 0, 520, 521, 1, 0, 0, 0, 521, 523, 1, 0, 0, 0, 522, 493, 1, 0, 0, 0, 522, 505, 1, 0, 0, 0, 522, 514, 1, 0, 0, 0, 523, 73, 1, 0, 0, 0, 524, 525, 5, 62, 0, 0, 525, 526, 3, 116, 58, 0, 526, 75, 1, 0, 0, 0, 527, 528, 5, 82, 0, 0, 528, 529, 3, 94, 47, 0, 529, 77, 1, 0, 0, 0, 530, 531, 6, 39, -1, 0, 531, 533, 3, 132, 66, 0, 532, 534, 5, 28, 0, 0, 533, 532, 1, 0, 0, 0, 533, 534, 1, 0, 0, 0, 534, 536, 1, 0, 0, 0, 535, 537, 3, 86, 43, 0, 536, 535, 1, 0, 0, 0, 536, 537, 1, 0, 0, 0, 537, 543, 1, 0, 0, 0, 538, 539, 5, 131, 0, 0, 539, 540, 3, 78, 39, 0, 540, 541, 5, 150, 0, 0, 541, 543, 1, 0, 0, 0, 542, 530, 1, 0, 0, 0, 542, 538, 1, 0, 0, 0, 543, 558, 1, 0, 0, 0, 544, 545, 10, 3, 0, 0, 545, 546, 3, 82, 41, 0, 546, 547, 3, 78, 39, 4, 547, 557, 1, 0, 0, 0, 548, 550, 10, 4, 0, 0, 549, 551, 3, 80, 40, 0, 550, 549, 1, 0, 0, 0, 550, 551, 1, 0, 0, 0, 551, 552, 1, 0, 0, 0, 552, 553, 5, 48, 0, 0, 553, 554, 3, 78, 39, 0, 554, 555, 3, 84, 42, 0, 555, 557, 1, 0, 0, 0, 556, 544, 1, 0, 0, 0, 556, 548, 1, 0, 0, 0, 557, 560, 1, 0, 0, 0, 558, 556, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 79, 1, 0, 0, 0, 560, 558, 1, 0, 0, 0, 561, 563, 7, 3, 0, 0, 562, 561, 1, 0, 0, 0, 562, 563, 1, 0, 0, 0, 563, 564, 1, 0, 0, 0, 564, 571, 5, 45, 0, 0, 565, 567, 5, 45, 0, 0, 566, 568, 7, 3, 0, 0, 567, 566, 1, 0, 0, 0, 567, 568, 1, 0, 0, 0, 568, 571, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 562, 1, 0, 0, 0, 570, 565, 1, 0, 0, 0, 570, 569, 1, 0, 0, 0, 571, 605, 1, 0, 0, 0, 572, 574, 7, 4, 0, 0, 573, 572, 1, 0, 0, 0, 573, 574, 1, 0, 0, 0, 574, 575, 1, 0, 0, 0, 575, 577, 7, 5, 0, 0, 576, 578, 5, 66, 0, 0, 577, 576, 1, 0, 0, 0, 577, 578, 1, 0, 0, 0, 578, 587, 1, 0, 0, 0, 579, 581, 7, 5, 0, 0, 580, 582, 5, 66, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 584, 1, 0, 0, 0, 583, 585, 7, 4, 0, 0, 584, 583, 1, 0, 0, 0, 584, 585, 1, 0, 0, 0, 585, 587, 1, 0, 0, 0, 586, 573, 1, 0, 0, 0, 586, 579, 1, 0, 0, 0, 587, 605, 1, 0, 0, 0, 588, 590, 7, 6, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 591, 1, 0, 0, 0, 591, 593, 5, 35, 0, 0, 592, 594, 5, 66, 0, 0, 593, 592, 1, 0, 0, 0, 593, 594, 1, 0, 0, 0, 594, 603, 1, 0, 0, 0, 595, 597, 5, 35, 0, 0, 596, 598, 5, 66, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 600, 1, 0, 0, 0, 599, 601, 7, 6, 0, 0, 600, 599, 1, 0, 0, 0, 600, 601, 1, 0, 0, 0, 601, 603, 1, 0, 0, 0, 602, 589, 1, 0, 0, 0, 602, 595, 1, 0, 0, 0, 603, 605, 1, 0, 0, 0, 604, 570, 1, 0, 0, 0, 604, 586, 1, 0, 0, 0, 604, 602, 1, 0, 0, 0, 605, 81, 1, 0, 0, 0, 606, 607, 5, 17, 0, 0, 607, 610, 5, 48, 0, 0, 608, 610, 5, 117, 0, 0, 609, 606, 1, 0, 0, 0, 609, 608, 1, 0, 0, 0, 610, 83, 1, 0, 0, 0, 611, 612, 5, 63, 0, 0, 612, 621, 3, 114, 57, 0, 613, 614, 5, 97, 0, 0, 614, 615, 5, 131, 0, 0, 615, 616, 3, 114, 57, 0, 616, 617, 5, 150, 0, 0, 617, 621, 1, 0, 0, 0, 618, 619, 5, 97, 0, 0, 619, 621, 3, 114, 57, 0, 620, 611, 1, 0, 0, 0, 620, 613, 1, 0, 0, 0, 620, 618, 1, 0, 0, 0, 621, 85, 1, 0, 0, 0, 622, 623, 5, 78, 0, 0, 623, 626, 3, 92, 46, 0, 624, 625, 5, 62, 0, 0, 625, 627, 3, 92, 46, 0, 626, 624, 1, 0, 0, 0, 626, 627, 1, 0, 0, 0, 627, 87, 1, 0, 0, 0, 628, 633, 3, 90, 45, 0, 629, 630, 5, 117, 0, 0, 630, 632, 3, 90, 45, 0, 631, 629, 1, 0, 0, 0, 632, 635, 1, 0, 0, 0, 633, 631, 1, 0, 0, 0, 633, 634, 1, 0, 0, 0, 634, 89, 1, 0, 0, 0, 635, 633, 1, 0, 0, 0, 636, 638, 3, 116, 58, 0, 637, 639, 7, 7, 0, 0, 638, 637, 1, 0, 0, 0, 638, 639, 1, 0, 0, 0, 639, 642, 1, 0, 0, 0, 640, 641, 5, 61, 0, 0, 641, 643, 7, 8, 0, 0, 642, 640, 1, 0, 0, 0, 642, 643, 1, 0, 0, 0, 643, 646, 1, 0, 0, 0, 644, 645, 5, 16, 0, 0, 645, 647, 5, 111, 0, 0, 646, 644, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 91, 1, 0, 0, 0, 648, 655, 3, 160, 80, 0, 649, 652, 3, 144, 72, 0, 650, 651, 5, 152, 0, 0, 651, 653, 3, 144, 72, 0, 652, 650, 1, 0, 0, 0, 652, 653, 1, 0, 0, 0, 653, 655, 1, 0, 0, 0, 654, 648, 1, 0, 0, 0, 654, 649, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 661, 3, 96, 48, 0, 657, 658, 5, 117, 0, 0, 658, 660, 3, 96, 48, 0, 659, 657, 1, 0, 0, 0, 660, 663, 1, 0, 0, 0, 661, 659, 1, 0, 0, 0, 661, 662, 1, 0, 0, 0, 662, 95, 1, 0, 0, 0, 663, 661, 1, 0, 0, 0, 664, 665, 3, 156, 78, 0, 665, 666, 5, 123, 0, 0, 666, 667, 3, 146, 73, 0, 667, 97, 1, 0, 0, 0, 668, 670, 3, 100, 50, 0, 669, 668, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 672, 1, 0, 0, 0, 671, 673, 3, 102, 51, 0, 672, 671, 1, 0, 0, 0, 672, 673, 1, 0, 0, 0, 673, 675, 1, 0, 0, 0, 674, 676, 3, 104, 52, 0, 675, 674, 1, 0, 0, 0, 675, 676, 1, 0, 0, 0, 676, 99, 1, 0, 0, 0, 677, 678, 5, 68, 0, 0, 678, 679, 5, 11, 0, 0, 679, 680, 3, 114, 57, 0, 680, 101, 1, 0, 0, 0, 681, 682, 5, 65, 0, 0, 682, 683, 5, 11, 0, 0, 683, 684, 3, 88, 44, 0, 684, 103, 1, 0, 0, 0, 685, 686, 7, 9, 0, 0, 686, 687, 3, 106, 53, 0, 687, 105, 1, 0, 0, 0, 688, 695, 3, 108, 54, 0, 689, 690, 5, 9, 0, 0, 690, 691, 3, 108, 54, 0, 691, 692, 5, 2, 0, 0, 692, 693, 3, 108, 54, 0, 693, 695, 1, 0, 0, 0, 694, 688, 1, 0, 0, 0, 694, 689, 1, 0, 0, 0, 695, 107, 1, 0, 0, 0, 696, 697, 5, 19, 0, 0, 697, 709, 5, 76, 0, 0, 698, 699, 5, 95, 0, 0, 699, 709, 5, 69, 0, 0, 700, 701, 5, 95, 0, 0, 701, 709, 5, 32, 0, 0, 702, 703, 3, 144, 72, 0, 703, 704, 5, 69, 0, 0, 704, 709, 1, 0, 0, 0, 705, 706, 3, 144, 72, 0, 706, 707, 5, 32, 0, 0, 707, 709, 1, 0, 0, 0, 708, 696, 1, 0, 0, 0, 708, 698, 1, 0, 0, 0, 708, 700, 1, 0, 0, 0, 708, 702, 1, 0, 0, 0, 708, 705, 1, 0, 0, 0, 709, 109, 1, 0, 0, 0, 710, 711, 3, 116, 58, 0, 711, 712, 5, 0, 0, 1, 712, 111, 1, 0, 0, 0, 713, 770, 3, 156, 78, 0, 714, 715, 3, 156, 78, 0, 715, 716, 5, 131, 0, 0, 716, 717, 3, 156, 78, 0, 717, 724, 3, 112, 56, 0, 718, 719, 5, 117, 0, 0, 719, 720, 3, 156, 78, 0, 720, 721, 3, 112, 56, 0, 721, 723, 1, 0, 0, 0, 722, 718, 1, 0, 0, 0, 723, 726, 1, 0, 0, 0, 724, 722, 1, 0, 0, 0, 724, 725, 1, 0, 0, 0, 725, 728, 1, 0, 0, 0, 726, 724, 1, 0, 0, 0, 727, 729, 5, 117, 0, 0, 728, 727, 1, 0, 0, 0, 728, 729, 1, 0, 0, 0, 729, 730, 1, 0, 0, 0, 730, 731, 5, 150, 0, 0, 731, 770, 1, 0, 0, 0, 732, 733, 3, 156, 78, 0, 733, 734, 5, 131, 0, 0, 734, 739, 3, 158, 79, 0, 735, 736, 5, 117, 0, 0, 736, 738, 3, 158, 79, 0, 737, 735, 1, 0, 0, 0, 738, 741, 1, 0, 0, 0, 739, 737, 1, 0, 0, 0, 739, 740, 1, 0, 0, 0, 740, 743, 1, 0, 0, 0, 741, 739, 1, 0, 0, 0, 742, 744, 5, 117, 0, 0, 743, 742, 1, 0, 0, 0, 743, 744, 1, 0, 0, 0, 744, 745, 1, 0, 0, 0, 745, 746, 5, 150, 0, 0, 746, 770, 1, 0, 0, 0, 747, 748, 3, 156, 78, 0, 748, 749, 5, 131, 0, 0, 749, 754, 3, 112, 56, 0, 750, 751, 5, 117, 0, 0, 751, 753, 3, 112, 56, 0, 752, 750, 1, 0, 0, 0, 753, 756, 1, 0, 0, 0, 754, 752, 1, 0, 0, 0, 754, 755, 1, 0, 0, 0, 755, 758, 1, 0, 0, 0, 756, 754, 1, 0, 0, 0, 757, 759, 5, 117, 0, 0, 758, 757, 1, 0, 0, 0, 758, 759, 1, 0, 0, 0, 759, 760, 1, 0, 0, 0, 760, 761, 5, 150, 0, 0, 761, 770, 1, 0, 0, 0, 762, 763, 3, 156, 78, 0, 763, 765, 5, 131, 0, 0, 764, 766, 3, 114, 57, 0, 765, 764, 1, 0, 0, 0, 765, 766, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 5, 150, 0, 0, 768, 770, 1, 0, 0, 0, 769, 713, 1, 0, 0, 0, 769, 714, 1, 0, 0, 0, 769, 732, 1, 0, 0, 0, 769, 747, 1, 0, 0, 0, 769, 762, 1, 0, 0, 0, 770, 113, 1, 0, 0, 0, 771, 776, 3, 116, 58, 0, 772, 773, 5, 117, 0, 0, 773, 775, 3, 116, 58, 0, 774, 772, 1, 0, 0, 0, 775, 778, 1, 0, 0, 0, 776, 774, 1, 0, 0, 0, 776, 777, 1, 0, 0, 0, 777, 780, 1, 0, 0, 0, 778, 776, 1, 0, 0, 0, 779, 781, 5, 117, 0, 0, 780, 779, 1, 0, 0, 0, 780, 781, 1, 0, 0, 0, 781, 115, 1, 0, 0, 0, 782, 783, 6, 58, -1, 0, 783, 785, 5, 12, 0, 0, 784, 786, 3, 116, 58, 0, 785, 784, 1, 0, 0, 0, 785, 786, 1, 0, 0, 0, 786, 792, 1, 0, 0, 0, 787, 788, 5, 99, 0, 0, 788, 789, 3, 116, 58, 0, 789, 790, 5, 84, 0, 0, 790, 791, 3, 116, 58, 0, 791, 793, 1, 0, 0, 0, 792, 787, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 792, 1, 0, 0, 0, 794, 795, 1, 0, 0, 0, 795, 798, 1, 0, 0, 0, 796, 797, 5, 25, 0, 0, 797, 799, 3, 116, 58, 0, 798, 796, 1, 0, 0, 0, 798, 799, 1, 0, 0, 0, 799, 800, 1, 0, 0, 0, 800, 801, 5, 26, 0, 0, 801, 933, 1, 0, 0, 0, 802, 803, 5, 13, 0, 0, 803, 804, 5, 131, 0, 0, 804, 805, 3, 116, 58, 0, 805, 806, 5, 6, 0, 0, 806, 807, 3, 112, 56, 0, 807, 808, 5, 150, 0, 0, 808, 933, 1, 0, 0, 0, 809, 810, 5, 20, 0, 0, 810, 933, 5, 111, 0, 0, 811, 812, 5, 46, 0, 0, 812, 813, 3, 116, 58, 0, 813, 814, 3, 148, 74, 0, 814, 933, 1, 0, 0, 0, 815, 816, 5, 83, 0, 0, 816, 817, 5, 131, 0, 0, 817, 818, 3, 116, 58, 0, 818, 819, 5, 34, 0, 0, 819, 822, 3, 116, 58, 0, 820, 821, 5, 33, 0, 0, 821, 823, 3, 116, 58, 0, 822, 820, 1, 0, 0, 0, 822, 823, 1, 0, 0, 0, 823, 824, 1, 0, 0, 0, 824, 825, 5, 150, 0, 0, 825, 933, 1, 0, 0, 0, 826, 827, 5, 87, 0, 0, 827, 933, 5, 111, 0, 0, 828, 829, 5, 92, 0, 0, 829, 830, 5, 131, 0, 0, 830, 831, 7, 10, 0, 0, 831, 832, 3, 162, 81, 0, 832, 833, 5, 34, 0, 0, 833, 834, 3, 116, 58, 0, 834, 835, 5, 150, 0, 0, 835, 933, 1, 0, 0, 0, 836, 837, 3, 156, 78, 0, 837, 839, 5, 131, 0, 0, 838, 840, 3, 114, 57, 0, 839, 838, 1, 0, 0, 0, 839, 840, 1, 0, 0, 0, 840, 841, 1, 0, 0, 0, 841, 842, 5, 150, 0, 0, 842, 851, 1, 0, 0, 0, 843, 845, 5, 131, 0, 0, 844, 846, 5, 24, 0, 0, 845, 844, 1, 0, 0, 0, 845, 846, 1, 0, 0, 0, 846, 848, 1, 0, 0, 0, 847, 849, 3, 114, 57, 0, 848, 847, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 1, 0, 0, 0, 850, 852, 5, 150, 0, 0, 851, 843, 1, 0, 0, 0, 851, 852, 1, 0, 0, 0, 852, 853, 1, 0, 0, 0, 853, 854, 5, 67, 0, 0, 854, 855, 5, 131, 0, 0, 855, 856, 3, 98, 49, 0, 856, 857, 5, 150, 0, 0, 857, 933, 1, 0, 0, 0, 858, 859, 3, 156, 78, 0, 859, 861, 5, 131, 0, 0, 860, 862, 3, 114, 57, 0, 861, 860, 1, 0, 0, 0, 861, 862, 1, 0, 0, 0, 862, 863, 1, 0, 0, 0, 863, 864, 5, 150, 0, 0, 864, 873, 1, 0, 0, 0, 865, 867, 5, 131, 0, 0, 866, 868, 5, 24, 0, 0, 867, 866, 1, 0, 0, 0, 867, 868, 1, 0, 0, 0, 868, 870, 1, 0, 0, 0, 869, 871, 3, 114, 57, 0, 870, 869, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 1, 0, 0, 0, 872, 874, 5, 150, 0, 0, 873, 865, 1, 0, 0, 0, 873, 874, 1, 0, 0, 0, 874, 875, 1, 0, 0, 0, 875, 876, 5, 67, 0, 0, 876, 877, 3, 156, 78, 0, 877, 933, 1, 0, 0, 0, 878, 884, 3, 156, 78, 0, 879, 881, 5, 131, 0, 0, 880, 882, 3, 114, 57, 0, 881, 880, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 885, 5, 150, 0, 0, 884, 879, 1, 0, 0, 0, 884, 885, 1, 0, 0, 0, 885, 886, 1, 0, 0, 0, 886, 888, 5, 131, 0, 0, 887, 889, 5, 24, 0, 0, 888, 887, 1, 0, 0, 0, 888, 889, 1, 0, 0, 0, 889, 891, 1, 0, 0, 0, 890, 892, 3, 114, 57, 0, 891, 890, 1, 0, 0, 0, 891, 892, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 5, 150, 0, 0, 894, 933, 1, 0, 0, 0, 895, 933, 3, 120, 60, 0, 896, 933, 3, 164, 82, 0, 897, 933, 3, 146, 73, 0, 898, 899, 5, 119, 0, 0, 899, 933, 3, 116, 58, 20, 900, 901, 5, 59, 0, 0, 901, 933, 3, 116, 58, 14, 902, 903, 3, 136, 68, 0, 903, 904, 5, 121, 0, 0, 904, 906, 1, 0, 0, 0, 905, 902, 1, 0, 0, 0, 905, 906, 1, 0, 0, 0, 906, 907, 1, 0, 0, 0, 907, 933, 5, 113, 0, 0, 908, 909, 5, 131, 0, 0, 909, 910, 3, 44, 22, 0, 910, 911, 5, 150, 0, 0, 911, 933, 1, 0, 0, 0, 912, 913, 5, 131, 0, 0, 913, 914, 3, 116, 58, 0, 914, 915, 5, 150, 0, 0, 915, 933, 1, 0, 0, 0, 916, 917, 5, 131, 0, 0, 917, 918, 3, 114, 57, 0, 918, 919, 5, 150, 0, 0, 919, 933, 1, 0, 0, 0, 920, 922, 5, 130, 0, 0, 921, 923, 3, 114, 57, 0, 922, 921, 1, 0, 0, 0, 922, 923, 1, 0, 0, 0, 923, 924, 1, 0, 0, 0, 924, 933, 5, 149, 0, 0, 925, 927, 5, 129, 0, 0, 926, 928, 3, 40, 20, 0, 927, 926, 1, 0, 0, 0, 927, 928, 1, 0, 0, 0, 928, 929, 1, 0, 0, 0, 929, 933, 5, 148, 0, 0, 930, 933, 3, 118, 59, 0, 931, 933, 3, 128, 64, 0, 932, 782, 1, 0, 0, 0, 932, 802, 1, 0, 0, 0, 932, 809, 1, 0, 0, 0, 932, 811, 1, 0, 0, 0, 932, 815, 1, 0, 0, 0, 932, 826, 1, 0, 0, 0, 932, 828, 1, 0, 0, 0, 932, 836, 1, 0, 0, 0, 932, 858, 1, 0, 0, 0, 932, 878, 1, 0, 0, 0, 932, 895, 1, 0, 0, 0, 932, 896, 1, 0, 0, 0, 932, 897, 1, 0, 0, 0, 932, 898, 1, 0, 0, 0, 932, 900, 1, 0, 0, 0, 932, 905, 1, 0, 0, 0, 932, 908, 1, 0, 0, 0, 932, 912, 1, 0, 0, 0, 932, 916, 1, 0, 0, 0, 932, 920, 1, 0, 0, 0, 932, 925, 1, 0, 0, 0, 932, 930, 1, 0, 0, 0, 932, 931, 1, 0, 0, 0, 933, 1044, 1, 0, 0, 0, 934, 938, 10, 19, 0, 0, 935, 939, 5, 113, 0, 0, 936, 939, 5, 152, 0, 0, 937, 939, 5, 139, 0, 0, 938, 935, 1, 0, 0, 0, 938, 936, 1, 0, 0, 0, 938, 937, 1, 0, 0, 0, 939, 940, 1, 0, 0, 0, 940, 1043, 3, 116, 58, 20, 941, 945, 10, 18, 0, 0, 942, 946, 5, 140, 0, 0, 943, 946, 5, 119, 0, 0, 944, 946, 5, 118, 0, 0, 945, 942, 1, 0, 0, 0, 945, 943, 1, 0, 0, 0, 945, 944, 1, 0, 0, 0, 946, 947, 1, 0, 0, 0, 947, 1043, 3, 116, 58, 19, 948, 973, 10, 17, 0, 0, 949, 974, 5, 122, 0, 0, 950, 974, 5, 123, 0, 0, 951, 974, 5, 134, 0, 0, 952, 974, 5, 132, 0, 0, 953, 974, 5, 133, 0, 0, 954, 974, 5, 124, 0, 0, 955, 974, 5, 125, 0, 0, 956, 958, 5, 59, 0, 0, 957, 956, 1, 0, 0, 0, 957, 958, 1, 0, 0, 0, 958, 959, 1, 0, 0, 0, 959, 961, 5, 43, 0, 0, 960, 962, 5, 15, 0, 0, 961, 960, 1, 0, 0, 0, 961, 962, 1, 0, 0, 0, 962, 974, 1, 0, 0, 0, 963, 965, 5, 59, 0, 0, 964, 963, 1, 0, 0, 0, 964, 965, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 974, 7, 11, 0, 0, 967, 974, 5, 146, 0, 0, 968, 974, 5, 147, 0, 0, 969, 974, 5, 136, 0, 0, 970, 974, 5, 127, 0, 0, 971, 974, 5, 128, 0, 0, 972, 974, 5, 135, 0, 0, 973, 949, 1, 0, 0, 0, 973, 950, 1, 0, 0, 0, 973, 951, 1, 0, 0, 0, 973, 952, 1, 0, 0, 0, 973, 953, 1, 0, 0, 0, 973, 954, 1, 0, 0, 0, 973, 955, 1, 0, 0, 0, 973, 957, 1, 0, 0, 0, 973, 964, 1, 0, 0, 0, 973, 967, 1, 0, 0, 0, 973, 968, 1, 0, 0, 0, 973, 969, 1, 0, 0, 0, 973, 970, 1, 0, 0, 0, 973, 971, 1, 0, 0, 0, 973, 972, 1, 0, 0, 0, 974, 975, 1, 0, 0, 0, 975, 1043, 3, 116, 58, 18, 976, 977, 10, 15, 0, 0, 977, 978, 5, 138, 0, 0, 978, 1043, 3, 116, 58, 16, 979, 980, 10, 13, 0, 0, 980, 981, 5, 2, 0, 0, 981, 1043, 3, 116, 58, 14, 982, 983, 10, 12, 0, 0, 983, 984, 5, 64, 0, 0, 984, 1043, 3, 116, 58, 13, 985, 987, 10, 11, 0, 0, 986, 988, 5, 59, 0, 0, 987, 986, 1, 0, 0, 0, 987, 988, 1, 0, 0, 0, 988, 989, 1, 0, 0, 0, 989, 990, 5, 9, 0, 0, 990, 991, 3, 116, 58, 0, 991, 992, 5, 2, 0, 0, 992, 993, 3, 116, 58, 12, 993, 1043, 1, 0, 0, 0, 994, 995, 10, 10, 0, 0, 995, 996, 5, 141, 0, 0, 996, 997, 3, 116, 58, 0, 997, 998, 5, 116, 0, 0, 998, 999, 3, 116, 58, 10, 999, 1043, 1, 0, 0, 0, 1000, 1001, 10, 30, 0, 0, 1001, 1003, 5, 131, 0, 0, 1002, 1004, 3, 114, 57, 0, 1003, 1002, 1, 0, 0, 0, 1003, 1004, 1, 0, 0, 0, 1004, 1005, 1, 0, 0, 0, 1005, 1043, 5, 150, 0, 0, 1006, 1007, 10, 26, 0, 0, 1007, 1008, 5, 130, 0, 0, 1008, 1009, 3, 116, 58, 0, 1009, 1010, 5, 149, 0, 0, 1010, 1043, 1, 0, 0, 0, 1011, 1012, 10, 25, 0, 0, 1012, 1013, 5, 121, 0, 0, 1013, 1043, 5, 109, 0, 0, 1014, 1015, 10, 24, 0, 0, 1015, 1016, 5, 121, 0, 0, 1016, 1043, 3, 156, 78, 0, 1017, 1018, 10, 23, 0, 0, 1018, 1019, 5, 137, 0, 0, 1019, 1020, 5, 130, 0, 0, 1020, 1021, 3, 116, 58, 0, 1021, 1022, 5, 149, 0, 0, 1022, 1043, 1, 0, 0, 0, 1023, 1024, 10, 22, 0, 0, 1024, 1025, 5, 137, 0, 0, 1025, 1043, 5, 109, 0, 0, 1026, 1027, 10, 21, 0, 0, 1027, 1028, 5, 137, 0, 0, 1028, 1043, 3, 156, 78, 0, 1029, 1030, 10, 16, 0, 0, 1030, 1032, 5, 47, 0, 0, 1031, 1033, 5, 59, 0, 0, 1032, 1031, 1, 0, 0, 0, 1032, 1033, 1, 0, 0, 0, 1033, 1034, 1, 0, 0, 0, 1034, 1043, 5, 60, 0, 0, 1035, 1040, 10, 9, 0, 0, 1036, 1037, 5, 6, 0, 0, 1037, 1041, 3, 156, 78, 0, 1038, 1039, 5, 6, 0, 0, 1039, 1041, 5, 111, 0, 0, 1040, 1036, 1, 0, 0, 0, 1040, 1038, 1, 0, 0, 0, 1041, 1043, 1, 0, 0, 0, 1042, 934, 1, 0, 0, 0, 1042, 941, 1, 0, 0, 0, 1042, 948, 1, 0, 0, 0, 1042, 976, 1, 0, 0, 0, 1042, 979, 1, 0, 0, 0, 1042, 982, 1, 0, 0, 0, 1042, 985, 1, 0, 0, 0, 1042, 994, 1, 0, 0, 0, 1042, 1000, 1, 0, 0, 0, 1042, 1006, 1, 0, 0, 0, 1042, 1011, 1, 0, 0, 0, 1042, 1014, 1, 0, 0, 0, 1042, 1017, 1, 0, 0, 0, 1042, 1023, 1, 0, 0, 0, 1042, 1026, 1, 0, 0, 0, 1042, 1029, 1, 0, 0, 0, 1042, 1035, 1, 0, 0, 0, 1043, 1046, 1, 0, 0, 0, 1044, 1042, 1, 0, 0, 0, 1044, 1045, 1, 0, 0, 0, 1045, 117, 1, 0, 0, 0, 1046, 1044, 1, 0, 0, 0, 1047, 1048, 5, 131, 0, 0, 1048, 1053, 3, 156, 78, 0, 1049, 1050, 5, 117, 0, 0, 1050, 1052, 3, 156, 78, 0, 1051, 1049, 1, 0, 0, 0, 1052, 1055, 1, 0, 0, 0, 1053, 1051, 1, 0, 0, 0, 1053, 1054, 1, 0, 0, 0, 1054, 1057, 1, 0, 0, 0, 1055, 1053, 1, 0, 0, 0, 1056, 1058, 5, 117, 0, 0, 1057, 1056, 1, 0, 0, 0, 1057, 1058, 1, 0, 0, 0, 1058, 1059, 1, 0, 0, 0, 1059, 1060, 5, 150, 0, 0, 1060, 1075, 1, 0, 0, 0, 1061, 1066, 3, 156, 78, 0, 1062, 1063, 5, 117, 0, 0, 1063, 1065, 3, 156, 78, 0, 1064, 1062, 1, 0, 0, 0, 1065, 1068, 1, 0, 0, 0, 1066, 1064, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1070, 1, 0, 0, 0, 1068, 1066, 1, 0, 0, 0, 1069, 1071, 5, 117, 0, 0, 1070, 1069, 1, 0, 0, 0, 1070, 1071, 1, 0, 0, 0, 1071, 1075, 1, 0, 0, 0, 1072, 1073, 5, 131, 0, 0, 1073, 1075, 5, 150, 0, 0, 1074, 1047, 1, 0, 0, 0, 1074, 1061, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1075, 1076, 1, 0, 0, 0, 1076, 1079, 5, 112, 0, 0, 1077, 1080, 3, 116, 58, 0, 1078, 1080, 3, 36, 18, 0, 1079, 1077, 1, 0, 0, 0, 1079, 1078, 1, 0, 0, 0, 1080, 119, 1, 0, 0, 0, 1081, 1082, 5, 133, 0, 0, 1082, 1086, 3, 156, 78, 0, 1083, 1085, 3, 122, 61, 0, 1084, 1083, 1, 0, 0, 0, 1085, 1088, 1, 0, 0, 0, 1086, 1084, 1, 0, 0, 0, 1086, 1087, 1, 0, 0, 0, 1087, 1089, 1, 0, 0, 0, 1088, 1086, 1, 0, 0, 0, 1089, 1090, 5, 152, 0, 0, 1090, 1091, 5, 125, 0, 0, 1091, 1114, 1, 0, 0, 0, 1092, 1093, 5, 133, 0, 0, 1093, 1097, 3, 156, 78, 0, 1094, 1096, 3, 122, 61, 0, 1095, 1094, 1, 0, 0, 0, 1096, 1099, 1, 0, 0, 0, 1097, 1095, 1, 0, 0, 0, 1097, 1098, 1, 0, 0, 0, 1098, 1100, 1, 0, 0, 0, 1099, 1097, 1, 0, 0, 0, 1100, 1106, 5, 125, 0, 0, 1101, 1107, 3, 120, 60, 0, 1102, 1103, 5, 129, 0, 0, 1103, 1104, 3, 116, 58, 0, 1104, 1105, 5, 148, 0, 0, 1105, 1107, 1, 0, 0, 0, 1106, 1101, 1, 0, 0, 0, 1106, 1102, 1, 0, 0, 0, 1106, 1107, 1, 0, 0, 0, 1107, 1108, 1, 0, 0, 0, 1108, 1109, 5, 133, 0, 0, 1109, 1110, 5, 152, 0, 0, 1110, 1111, 3, 156, 78, 0, 1111, 1112, 5, 125, 0, 0, 1112, 1114, 1, 0, 0, 0, 1113, 1081, 1, 0, 0, 0, 1113, 1092, 1, 0, 0, 0, 1114, 121, 1, 0, 0, 0, 1115, 1116, 3, 156, 78, 0, 1116, 1117, 5, 123, 0, 0, 1117, 1118, 3, 162, 81, 0, 1118, 1127, 1, 0, 0, 0, 1119, 1120, 3, 156, 78, 0, 1120, 1121, 5, 123, 0, 0, 1121, 1122, 5, 129, 0, 0, 1122, 1123, 3, 116, 58, 0, 1123, 1124, 5, 148, 0, 0, 1124, 1127, 1, 0, 0, 0, 1125, 1127, 3, 156, 78, 0, 1126, 1115, 1, 0, 0, 0, 1126, 1119, 1, 0, 0, 0, 1126, 1125, 1, 0, 0, 0, 1127, 123, 1, 0, 0, 0, 1128, 1133, 3, 126, 63, 0, 1129, 1130, 5, 117, 0, 0, 1130, 1132, 3, 126, 63, 0, 1131, 1129, 1, 0, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1131, 1, 0, 0, 0, 1133, 1134, 1, 0, 0, 0, 1134, 1137, 1, 0, 0, 0, 1135, 1133, 1, 0, 0, 0, 1136, 1138, 5, 117, 0, 0, 1137, 1136, 1, 0, 0, 0, 1137, 1138, 1, 0, 0, 0, 1138, 125, 1, 0, 0, 0, 1139, 1140, 3, 156, 78, 0, 1140, 1141, 5, 6, 0, 0, 1141, 1142, 5, 131, 0, 0, 1142, 1143, 3, 44, 22, 0, 1143, 1144, 5, 150, 0, 0, 1144, 1150, 1, 0, 0, 0, 1145, 1146, 3, 116, 58, 0, 1146, 1147, 5, 6, 0, 0, 1147, 1148, 3, 156, 78, 0, 1148, 1150, 1, 0, 0, 0, 1149, 1139, 1, 0, 0, 0, 1149, 1145, 1, 0, 0, 0, 1150, 127, 1, 0, 0, 0, 1151, 1159, 3, 160, 80, 0, 1152, 1153, 3, 136, 68, 0, 1153, 1154, 5, 121, 0, 0, 1154, 1156, 1, 0, 0, 0, 1155, 1152, 1, 0, 0, 0, 1155, 1156, 1, 0, 0, 0, 1156, 1157, 1, 0, 0, 0, 1157, 1159, 3, 130, 65, 0, 1158, 1151, 1, 0, 0, 0, 1158, 1155, 1, 0, 0, 0, 1159, 129, 1, 0, 0, 0, 1160, 1165, 3, 156, 78, 0, 1161, 1162, 5, 121, 0, 0, 1162, 1164, 3, 156, 78, 0, 1163, 1161, 1, 0, 0, 0, 1164, 1167, 1, 0, 0, 0, 1165, 1163, 1, 0, 0, 0, 1165, 1166, 1, 0, 0, 0, 1166, 131, 1, 0, 0, 0, 1167, 1165, 1, 0, 0, 0, 1168, 1169, 6, 66, -1, 0, 1169, 1178, 3, 136, 68, 0, 1170, 1178, 3, 134, 67, 0, 1171, 1172, 5, 131, 0, 0, 1172, 1173, 3, 44, 22, 0, 1173, 1174, 5, 150, 0, 0, 1174, 1178, 1, 0, 0, 0, 1175, 1178, 3, 120, 60, 0, 1176, 1178, 3, 160, 80, 0, 1177, 1168, 1, 0, 0, 0, 1177, 1170, 1, 0, 0, 0, 1177, 1171, 1, 0, 0, 0, 1177, 1175, 1, 0, 0, 0, 1177, 1176, 1, 0, 0, 0, 1178, 1187, 1, 0, 0, 0, 1179, 1183, 10, 3, 0, 0, 1180, 1184, 3, 154, 77, 0, 1181, 1182, 5, 6, 0, 0, 1182, 1184, 3, 156, 78, 0, 1183, 1180, 1, 0, 0, 0, 1183, 1181, 1, 0, 0, 0, 1184, 1186, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1186, 1189, 1, 0, 0, 0, 1187, 1185, 1, 0, 0, 0, 1187, 1188, 1, 0, 0, 0, 1188, 133, 1, 0, 0, 0, 1189, 1187, 1, 0, 0, 0, 1190, 1191, 3, 156, 78, 0, 1191, 1193, 5, 131, 0, 0, 1192, 1194, 3, 138, 69, 0, 1193, 1192, 1, 0, 0, 0, 1193, 1194, 1, 0, 0, 0, 1194, 1195, 1, 0, 0, 0, 1195, 1196, 5, 150, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1198, 3, 140, 70, 0, 1198, 1199, 5, 121, 0, 0, 1199, 1201, 1, 0, 0, 0, 1200, 1197, 1, 0, 0, 0, 1200, 1201, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 3, 156, 78, 0, 1203, 137, 1, 0, 0, 0, 1204, 1209, 3, 116, 58, 0, 1205, 1206, 5, 117, 0, 0, 1206, 1208, 3, 116, 58, 0, 1207, 1205, 1, 0, 0, 0, 1208, 1211, 1, 0, 0, 0, 1209, 1207, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1213, 1, 0, 0, 0, 1211, 1209, 1, 0, 0, 0, 1212, 1214, 5, 117, 0, 0, 1213, 1212, 1, 0, 0, 0, 1213, 1214, 1, 0, 0, 0, 1214, 139, 1, 0, 0, 0, 1215, 1216, 3, 156, 78, 0, 1216, 141, 1, 0, 0, 0, 1217, 1226, 5, 107, 0, 0, 1218, 1219, 5, 121, 0, 0, 1219, 1226, 7, 12, 0, 0, 1220, 1221, 5, 109, 0, 0, 1221, 1223, 5, 121, 0, 0, 1222, 1224, 7, 12, 0, 0, 1223, 1222, 1, 0, 0, 0, 1223, 1224, 1, 0, 0, 0, 1224, 1226, 1, 0, 0, 0, 1225, 1217, 1, 0, 0, 0, 1225, 1218, 1, 0, 0, 0, 1225, 1220, 1, 0, 0, 0, 1226, 143, 1, 0, 0, 0, 1227, 1229, 7, 13, 0, 0, 1228, 1227, 1, 0, 0, 0, 1228, 1229, 1, 0, 0, 0, 1229, 1236, 1, 0, 0, 0, 1230, 1237, 3, 142, 71, 0, 1231, 1237, 5, 108, 0, 0, 1232, 1237, 5, 109, 0, 0, 1233, 1237, 5, 110, 0, 0, 1234, 1237, 5, 44, 0, 0, 1235, 1237, 5, 58, 0, 0, 1236, 1230, 1, 0, 0, 0, 1236, 1231, 1, 0, 0, 0, 1236, 1232, 1, 0, 0, 0, 1236, 1233, 1, 0, 0, 0, 1236, 1234, 1, 0, 0, 0, 1236, 1235, 1, 0, 0, 0, 1237, 145, 1, 0, 0, 0, 1238, 1242, 3, 144, 72, 0, 1239, 1242, 5, 111, 0, 0, 1240, 1242, 5, 60, 0, 0, 1241, 1238, 1, 0, 0, 0, 1241, 1239, 1, 0, 0, 0, 1241, 1240, 1, 0, 0, 0, 1242, 147, 1, 0, 0, 0, 1243, 1244, 7, 14, 0, 0, 1244, 149, 1, 0, 0, 0, 1245, 1246, 7, 15, 0, 0, 1246, 151, 1, 0, 0, 0, 1247, 1248, 7, 16, 0, 0, 1248, 153, 1, 0, 0, 0, 1249, 1252, 5, 106, 0, 0, 1250, 1252, 3, 152, 76, 0, 1251, 1249, 1, 0, 0, 0, 1251, 1250, 1, 0, 0, 0, 1252, 155, 1, 0, 0, 0, 1253, 1257, 5, 106, 0, 0, 1254, 1257, 3, 148, 74, 0, 1255, 1257, 3, 150, 75, 0, 1256, 1253, 1, 0, 0, 0, 1256, 1254, 1, 0, 0, 0, 1256, 1255, 1, 0, 0, 0, 1257, 157, 1, 0, 0, 0, 1258, 1259, 3, 162, 81, 0, 1259, 1260, 5, 123, 0, 0, 1260, 1261, 3, 144, 72, 0, 1261, 159, 1, 0, 0, 0, 1262, 1263, 5, 129, 0, 0, 1263, 1264, 3, 116, 58, 0, 1264, 1265, 5, 148, 0, 0, 1265, 161, 1, 0, 0, 0, 1266, 1269, 5, 111, 0, 0, 1267, 1269, 3, 164, 82, 0, 1268, 1266, 1, 0, 0, 0, 1268, 1267, 1, 0, 0, 0, 1269, 163, 1, 0, 0, 0, 1270, 1274, 5, 143, 0, 0, 1271, 1273, 3, 166, 83, 0, 1272, 1271, 1, 0, 0, 0, 1273, 1276, 1, 0, 0, 0, 1274, 1272, 1, 0, 0, 0, 1274, 1275, 1, 0, 0, 0, 1275, 1277, 1, 0, 0, 0, 1276, 1274, 1, 0, 0, 0, 1277, 1278, 5, 145, 0, 0, 1278, 165, 1, 0, 0, 0, 1279, 1280, 5, 158, 0, 0, 1280, 1281, 3, 116, 58, 0, 1281, 1282, 5, 148, 0, 0, 1282, 1285, 1, 0, 0, 0, 1283, 1285, 5, 157, 0, 0, 1284, 1279, 1, 0, 0, 0, 1284, 1283, 1, 0, 0, 0, 1285, 167, 1, 0, 0, 0, 1286, 1290, 5, 144, 0, 0, 1287, 1289, 3, 170, 85, 0, 1288, 1287, 1, 0, 0, 0, 1289, 1292, 1, 0, 0, 0, 1290, 1288, 1, 0, 0, 0, 1290, 1291, 1, 0, 0, 0, 1291, 1293, 1, 0, 0, 0, 1292, 1290, 1, 0, 0, 0, 1293, 1294, 5, 0, 0, 1, 1294, 169, 1, 0, 0, 0, 1295, 1296, 5, 160, 0, 0, 1296, 1297, 3, 116, 58, 0, 1297, 1298, 5, 148, 0, 0, 1298, 1301, 1, 0, 0, 0, 1299, 1301, 5, 159, 0, 0, 1300, 1295, 1, 0, 0, 0, 1300, 1299, 1, 0, 0, 0, 1301, 171, 1, 0, 0, 0, 167, 175, 182, 191, 198, 202, 216, 220, 223, 227, 230, 237, 241, 250, 255, 264, 272, 279, 283, 289, 294, 302, 309, 315, 327, 335, 349, 353, 358, 368, 377, 380, 384, 387, 391, 394, 397, 400, 403, 407, 411, 414, 417, 420, 424, 427, 436, 442, 463, 480, 497, 503, 509, 520, 522, 533, 536, 542, 550, 556, 558, 562, 567, 570, 573, 577, 581, 584, 586, 589, 593, 597, 600, 602, 604, 609, 620, 626, 633, 638, 642, 646, 652, 654, 661, 669, 672, 675, 694, 708, 724, 728, 739, 743, 754, 758, 765, 769, 776, 780, 785, 794, 798, 822, 839, 845, 848, 851, 861, 867, 870, 873, 881, 884, 888, 891, 905, 922, 927, 932, 938, 945, 957, 961, 964, 973, 987, 1003, 1032, 1040, 1042, 1044, 1053, 1057, 1066, 1070, 1074, 1079, 1086, 1097, 1106, 1113, 1126, 1133, 1137, 1149, 1155, 1158, 1165, 1177, 1183, 1187, 1193, 1200, 1209, 1213, 1223, 1225, 1228, 1236, 1241, 1251, 1256, 1268, 1274, 1284, 1290, 1300] \ No newline at end of file +[4, 1, 162, 1311, 2, 0, 7, 0, 2, 1, 7, 1, 2, 2, 7, 2, 2, 3, 7, 3, 2, 4, 7, 4, 2, 5, 7, 5, 2, 6, 7, 6, 2, 7, 7, 7, 2, 8, 7, 8, 2, 9, 7, 9, 2, 10, 7, 10, 2, 11, 7, 11, 2, 12, 7, 12, 2, 13, 7, 13, 2, 14, 7, 14, 2, 15, 7, 15, 2, 16, 7, 16, 2, 17, 7, 17, 2, 18, 7, 18, 2, 19, 7, 19, 2, 20, 7, 20, 2, 21, 7, 21, 2, 22, 7, 22, 2, 23, 7, 23, 2, 24, 7, 24, 2, 25, 7, 25, 2, 26, 7, 26, 2, 27, 7, 27, 2, 28, 7, 28, 2, 29, 7, 29, 2, 30, 7, 30, 2, 31, 7, 31, 2, 32, 7, 32, 2, 33, 7, 33, 2, 34, 7, 34, 2, 35, 7, 35, 2, 36, 7, 36, 2, 37, 7, 37, 2, 38, 7, 38, 2, 39, 7, 39, 2, 40, 7, 40, 2, 41, 7, 41, 2, 42, 7, 42, 2, 43, 7, 43, 2, 44, 7, 44, 2, 45, 7, 45, 2, 46, 7, 46, 2, 47, 7, 47, 2, 48, 7, 48, 2, 49, 7, 49, 2, 50, 7, 50, 2, 51, 7, 51, 2, 52, 7, 52, 2, 53, 7, 53, 2, 54, 7, 54, 2, 55, 7, 55, 2, 56, 7, 56, 2, 57, 7, 57, 2, 58, 7, 58, 2, 59, 7, 59, 2, 60, 7, 60, 2, 61, 7, 61, 2, 62, 7, 62, 2, 63, 7, 63, 2, 64, 7, 64, 2, 65, 7, 65, 2, 66, 7, 66, 2, 67, 7, 67, 2, 68, 7, 68, 2, 69, 7, 69, 2, 70, 7, 70, 2, 71, 7, 71, 2, 72, 7, 72, 2, 73, 7, 73, 2, 74, 7, 74, 2, 75, 7, 75, 2, 76, 7, 76, 2, 77, 7, 77, 2, 78, 7, 78, 2, 79, 7, 79, 2, 80, 7, 80, 2, 81, 7, 81, 2, 82, 7, 82, 2, 83, 7, 83, 2, 84, 7, 84, 2, 85, 7, 85, 2, 86, 7, 86, 1, 0, 5, 0, 176, 8, 0, 10, 0, 12, 0, 179, 9, 0, 1, 0, 1, 0, 1, 1, 1, 1, 3, 1, 185, 8, 1, 1, 2, 1, 2, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 3, 194, 8, 3, 1, 4, 1, 4, 1, 4, 5, 4, 199, 8, 4, 10, 4, 12, 4, 202, 9, 4, 1, 4, 3, 4, 205, 8, 4, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 1, 5, 3, 5, 219, 8, 5, 1, 6, 1, 6, 3, 6, 223, 8, 6, 1, 6, 3, 6, 226, 8, 6, 1, 7, 1, 7, 3, 7, 230, 8, 7, 1, 7, 3, 7, 233, 8, 7, 1, 8, 1, 8, 1, 8, 1, 8, 1, 8, 3, 8, 240, 8, 8, 1, 8, 1, 8, 3, 8, 244, 8, 8, 1, 8, 1, 8, 1, 9, 1, 9, 1, 9, 5, 9, 251, 8, 9, 10, 9, 12, 9, 254, 9, 9, 1, 9, 1, 9, 3, 9, 258, 8, 9, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 1, 10, 3, 10, 267, 8, 10, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 1, 11, 3, 11, 275, 8, 11, 1, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 282, 8, 12, 1, 12, 1, 12, 3, 12, 286, 8, 12, 1, 12, 1, 12, 1, 12, 1, 12, 3, 12, 292, 8, 12, 1, 12, 1, 12, 1, 12, 3, 12, 297, 8, 12, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 305, 8, 13, 1, 13, 1, 13, 1, 13, 1, 13, 1, 13, 3, 13, 312, 8, 13, 1, 14, 1, 14, 1, 14, 1, 14, 3, 14, 318, 8, 14, 1, 14, 1, 14, 1, 14, 1, 15, 1, 15, 1, 15, 1, 15, 1, 15, 1, 16, 1, 16, 3, 16, 330, 8, 16, 1, 17, 1, 17, 1, 18, 1, 18, 5, 18, 336, 8, 18, 10, 18, 12, 18, 339, 9, 18, 1, 18, 1, 18, 1, 19, 1, 19, 1, 19, 1, 19, 1, 20, 1, 20, 1, 20, 5, 20, 350, 8, 20, 10, 20, 12, 20, 353, 9, 20, 1, 20, 3, 20, 356, 8, 20, 1, 21, 1, 21, 1, 21, 3, 21, 361, 8, 21, 1, 21, 1, 21, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 1, 22, 3, 22, 371, 8, 22, 1, 23, 1, 23, 1, 23, 1, 23, 3, 23, 377, 8, 23, 1, 23, 1, 23, 1, 24, 1, 24, 5, 24, 383, 8, 24, 10, 24, 12, 24, 386, 9, 24, 1, 25, 3, 25, 389, 8, 25, 1, 25, 1, 25, 3, 25, 393, 8, 25, 1, 25, 3, 25, 396, 8, 25, 1, 25, 1, 25, 3, 25, 400, 8, 25, 1, 25, 3, 25, 403, 8, 25, 1, 25, 3, 25, 406, 8, 25, 1, 25, 3, 25, 409, 8, 25, 1, 25, 3, 25, 412, 8, 25, 1, 25, 1, 25, 3, 25, 416, 8, 25, 1, 25, 1, 25, 3, 25, 420, 8, 25, 1, 25, 3, 25, 423, 8, 25, 1, 25, 3, 25, 426, 8, 25, 1, 25, 3, 25, 429, 8, 25, 1, 25, 1, 25, 3, 25, 433, 8, 25, 1, 25, 3, 25, 436, 8, 25, 1, 26, 1, 26, 1, 26, 1, 27, 1, 27, 1, 27, 1, 27, 3, 27, 445, 8, 27, 1, 28, 1, 28, 1, 28, 1, 29, 3, 29, 451, 8, 29, 1, 29, 1, 29, 1, 29, 1, 29, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 1, 30, 5, 30, 470, 8, 30, 10, 30, 12, 30, 473, 9, 30, 1, 31, 1, 31, 1, 31, 1, 32, 1, 32, 1, 32, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 1, 33, 3, 33, 489, 8, 33, 1, 34, 1, 34, 1, 34, 1, 35, 1, 35, 1, 35, 1, 35, 1, 36, 1, 36, 1, 36, 1, 36, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 506, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 512, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 518, 8, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 1, 37, 3, 37, 529, 8, 37, 3, 37, 531, 8, 37, 1, 38, 1, 38, 1, 38, 1, 39, 1, 39, 1, 39, 1, 40, 1, 40, 1, 40, 3, 40, 542, 8, 40, 1, 40, 3, 40, 545, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 551, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 1, 40, 3, 40, 559, 8, 40, 1, 40, 1, 40, 1, 40, 1, 40, 5, 40, 565, 8, 40, 10, 40, 12, 40, 568, 9, 40, 1, 41, 3, 41, 571, 8, 41, 1, 41, 1, 41, 1, 41, 3, 41, 576, 8, 41, 1, 41, 3, 41, 579, 8, 41, 1, 41, 3, 41, 582, 8, 41, 1, 41, 1, 41, 3, 41, 586, 8, 41, 1, 41, 1, 41, 3, 41, 590, 8, 41, 1, 41, 3, 41, 593, 8, 41, 3, 41, 595, 8, 41, 1, 41, 3, 41, 598, 8, 41, 1, 41, 1, 41, 3, 41, 602, 8, 41, 1, 41, 1, 41, 3, 41, 606, 8, 41, 1, 41, 3, 41, 609, 8, 41, 3, 41, 611, 8, 41, 3, 41, 613, 8, 41, 1, 42, 1, 42, 1, 42, 3, 42, 618, 8, 42, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 1, 43, 3, 43, 629, 8, 43, 1, 44, 1, 44, 1, 44, 1, 44, 3, 44, 635, 8, 44, 1, 45, 1, 45, 1, 45, 5, 45, 640, 8, 45, 10, 45, 12, 45, 643, 9, 45, 1, 46, 1, 46, 3, 46, 647, 8, 46, 1, 46, 1, 46, 3, 46, 651, 8, 46, 1, 46, 1, 46, 3, 46, 655, 8, 46, 1, 47, 1, 47, 1, 47, 1, 47, 3, 47, 661, 8, 47, 3, 47, 663, 8, 47, 1, 48, 1, 48, 1, 48, 5, 48, 668, 8, 48, 10, 48, 12, 48, 671, 9, 48, 1, 49, 1, 49, 1, 49, 1, 49, 1, 50, 3, 50, 678, 8, 50, 1, 50, 3, 50, 681, 8, 50, 1, 50, 3, 50, 684, 8, 50, 1, 51, 1, 51, 1, 51, 1, 51, 1, 52, 1, 52, 1, 52, 1, 52, 1, 53, 1, 53, 1, 53, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 1, 54, 3, 54, 703, 8, 54, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 1, 55, 3, 55, 717, 8, 55, 1, 56, 1, 56, 1, 56, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 731, 8, 57, 10, 57, 12, 57, 734, 9, 57, 1, 57, 3, 57, 737, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 746, 8, 57, 10, 57, 12, 57, 749, 9, 57, 1, 57, 3, 57, 752, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 5, 57, 761, 8, 57, 10, 57, 12, 57, 764, 9, 57, 1, 57, 3, 57, 767, 8, 57, 1, 57, 1, 57, 1, 57, 1, 57, 1, 57, 3, 57, 774, 8, 57, 1, 57, 1, 57, 3, 57, 778, 8, 57, 1, 58, 1, 58, 1, 58, 5, 58, 783, 8, 58, 10, 58, 12, 58, 786, 9, 58, 1, 58, 3, 58, 789, 8, 58, 1, 59, 1, 59, 1, 59, 3, 59, 794, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 4, 59, 801, 8, 59, 11, 59, 12, 59, 802, 1, 59, 1, 59, 3, 59, 807, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 831, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 848, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 854, 8, 59, 1, 59, 3, 59, 857, 8, 59, 1, 59, 3, 59, 860, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 870, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 876, 8, 59, 1, 59, 3, 59, 879, 8, 59, 1, 59, 3, 59, 882, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 890, 8, 59, 1, 59, 3, 59, 893, 8, 59, 1, 59, 1, 59, 3, 59, 897, 8, 59, 1, 59, 3, 59, 900, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 914, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 931, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 936, 8, 59, 1, 59, 1, 59, 1, 59, 3, 59, 941, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 947, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 954, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 966, 8, 59, 1, 59, 1, 59, 3, 59, 970, 8, 59, 1, 59, 3, 59, 973, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 982, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 996, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1012, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1041, 8, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 1, 59, 3, 59, 1049, 8, 59, 5, 59, 1051, 8, 59, 10, 59, 12, 59, 1054, 9, 59, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1060, 8, 60, 10, 60, 12, 60, 1063, 9, 60, 1, 60, 3, 60, 1066, 8, 60, 1, 60, 1, 60, 1, 60, 1, 60, 1, 60, 5, 60, 1073, 8, 60, 10, 60, 12, 60, 1076, 9, 60, 1, 60, 3, 60, 1079, 8, 60, 1, 60, 1, 60, 3, 60, 1083, 8, 60, 1, 60, 1, 60, 1, 60, 3, 60, 1088, 8, 60, 1, 61, 1, 61, 1, 61, 5, 61, 1093, 8, 61, 10, 61, 12, 61, 1096, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 5, 61, 1104, 8, 61, 10, 61, 12, 61, 1107, 9, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1115, 8, 61, 1, 61, 1, 61, 1, 61, 1, 61, 1, 61, 3, 61, 1122, 8, 61, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 1, 62, 3, 62, 1135, 8, 62, 1, 63, 1, 63, 1, 63, 5, 63, 1140, 8, 63, 10, 63, 12, 63, 1143, 9, 63, 1, 63, 3, 63, 1146, 8, 63, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 1, 64, 3, 64, 1158, 8, 64, 1, 65, 1, 65, 1, 65, 1, 65, 3, 65, 1164, 8, 65, 1, 65, 3, 65, 1167, 8, 65, 1, 66, 1, 66, 1, 66, 5, 66, 1172, 8, 66, 10, 66, 12, 66, 1175, 9, 66, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1186, 8, 67, 1, 67, 1, 67, 1, 67, 1, 67, 3, 67, 1192, 8, 67, 5, 67, 1194, 8, 67, 10, 67, 12, 67, 1197, 9, 67, 1, 68, 1, 68, 1, 68, 3, 68, 1202, 8, 68, 1, 68, 1, 68, 1, 69, 1, 69, 1, 69, 3, 69, 1209, 8, 69, 1, 69, 1, 69, 1, 70, 1, 70, 1, 70, 5, 70, 1216, 8, 70, 10, 70, 12, 70, 1219, 9, 70, 1, 70, 3, 70, 1222, 8, 70, 1, 71, 1, 71, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 1, 72, 3, 72, 1232, 8, 72, 3, 72, 1234, 8, 72, 1, 73, 3, 73, 1237, 8, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 1, 73, 3, 73, 1245, 8, 73, 1, 74, 1, 74, 1, 74, 3, 74, 1250, 8, 74, 1, 75, 1, 75, 1, 76, 1, 76, 1, 77, 1, 77, 1, 78, 1, 78, 3, 78, 1260, 8, 78, 1, 79, 1, 79, 1, 79, 3, 79, 1265, 8, 79, 1, 80, 1, 80, 1, 80, 1, 80, 1, 81, 1, 81, 1, 81, 1, 81, 1, 82, 1, 82, 3, 82, 1277, 8, 82, 1, 83, 1, 83, 5, 83, 1281, 8, 83, 10, 83, 12, 83, 1284, 9, 83, 1, 83, 1, 83, 1, 84, 1, 84, 1, 84, 1, 84, 1, 84, 3, 84, 1293, 8, 84, 1, 85, 1, 85, 5, 85, 1297, 8, 85, 10, 85, 12, 85, 1300, 9, 85, 1, 85, 1, 85, 1, 86, 1, 86, 1, 86, 1, 86, 1, 86, 3, 86, 1309, 8, 86, 1, 86, 0, 3, 80, 118, 134, 87, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 80, 82, 84, 86, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 116, 118, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 170, 172, 0, 17, 2, 0, 32, 32, 37, 37, 2, 0, 18, 18, 77, 77, 2, 0, 46, 46, 54, 54, 3, 0, 1, 1, 4, 4, 8, 8, 4, 0, 1, 1, 3, 4, 8, 8, 83, 83, 2, 0, 54, 54, 76, 76, 2, 0, 1, 1, 4, 4, 2, 0, 7, 7, 22, 23, 2, 0, 31, 31, 52, 52, 2, 0, 74, 74, 79, 79, 3, 0, 10, 10, 53, 53, 93, 93, 2, 0, 43, 43, 56, 56, 1, 0, 110, 111, 2, 0, 121, 121, 142, 142, 7, 0, 21, 21, 40, 40, 58, 59, 73, 73, 81, 81, 100, 100, 106, 106, 19, 0, 1, 13, 15, 20, 22, 26, 28, 29, 31, 31, 33, 36, 38, 39, 41, 44, 46, 46, 48, 54, 56, 57, 61, 61, 63, 72, 74, 80, 82, 86, 88, 95, 97, 99, 101, 102, 104, 105, 4, 0, 20, 20, 31, 31, 41, 41, 51, 51, 1484, 0, 177, 1, 0, 0, 0, 2, 184, 1, 0, 0, 0, 4, 186, 1, 0, 0, 0, 6, 188, 1, 0, 0, 0, 8, 195, 1, 0, 0, 0, 10, 218, 1, 0, 0, 0, 12, 220, 1, 0, 0, 0, 14, 227, 1, 0, 0, 0, 16, 234, 1, 0, 0, 0, 18, 247, 1, 0, 0, 0, 20, 259, 1, 0, 0, 0, 22, 268, 1, 0, 0, 0, 24, 276, 1, 0, 0, 0, 26, 298, 1, 0, 0, 0, 28, 313, 1, 0, 0, 0, 30, 322, 1, 0, 0, 0, 32, 327, 1, 0, 0, 0, 34, 331, 1, 0, 0, 0, 36, 333, 1, 0, 0, 0, 38, 342, 1, 0, 0, 0, 40, 346, 1, 0, 0, 0, 42, 360, 1, 0, 0, 0, 44, 370, 1, 0, 0, 0, 46, 376, 1, 0, 0, 0, 48, 380, 1, 0, 0, 0, 50, 388, 1, 0, 0, 0, 52, 437, 1, 0, 0, 0, 54, 440, 1, 0, 0, 0, 56, 446, 1, 0, 0, 0, 58, 450, 1, 0, 0, 0, 60, 456, 1, 0, 0, 0, 62, 474, 1, 0, 0, 0, 64, 477, 1, 0, 0, 0, 66, 480, 1, 0, 0, 0, 68, 490, 1, 0, 0, 0, 70, 493, 1, 0, 0, 0, 72, 497, 1, 0, 0, 0, 74, 530, 1, 0, 0, 0, 76, 532, 1, 0, 0, 0, 78, 535, 1, 0, 0, 0, 80, 550, 1, 0, 0, 0, 82, 612, 1, 0, 0, 0, 84, 617, 1, 0, 0, 0, 86, 628, 1, 0, 0, 0, 88, 630, 1, 0, 0, 0, 90, 636, 1, 0, 0, 0, 92, 644, 1, 0, 0, 0, 94, 662, 1, 0, 0, 0, 96, 664, 1, 0, 0, 0, 98, 672, 1, 0, 0, 0, 100, 677, 1, 0, 0, 0, 102, 685, 1, 0, 0, 0, 104, 689, 1, 0, 0, 0, 106, 693, 1, 0, 0, 0, 108, 702, 1, 0, 0, 0, 110, 716, 1, 0, 0, 0, 112, 718, 1, 0, 0, 0, 114, 777, 1, 0, 0, 0, 116, 779, 1, 0, 0, 0, 118, 940, 1, 0, 0, 0, 120, 1082, 1, 0, 0, 0, 122, 1121, 1, 0, 0, 0, 124, 1134, 1, 0, 0, 0, 126, 1136, 1, 0, 0, 0, 128, 1157, 1, 0, 0, 0, 130, 1166, 1, 0, 0, 0, 132, 1168, 1, 0, 0, 0, 134, 1185, 1, 0, 0, 0, 136, 1198, 1, 0, 0, 0, 138, 1208, 1, 0, 0, 0, 140, 1212, 1, 0, 0, 0, 142, 1223, 1, 0, 0, 0, 144, 1233, 1, 0, 0, 0, 146, 1236, 1, 0, 0, 0, 148, 1249, 1, 0, 0, 0, 150, 1251, 1, 0, 0, 0, 152, 1253, 1, 0, 0, 0, 154, 1255, 1, 0, 0, 0, 156, 1259, 1, 0, 0, 0, 158, 1264, 1, 0, 0, 0, 160, 1266, 1, 0, 0, 0, 162, 1270, 1, 0, 0, 0, 164, 1276, 1, 0, 0, 0, 166, 1278, 1, 0, 0, 0, 168, 1292, 1, 0, 0, 0, 170, 1294, 1, 0, 0, 0, 172, 1308, 1, 0, 0, 0, 174, 176, 3, 2, 1, 0, 175, 174, 1, 0, 0, 0, 176, 179, 1, 0, 0, 0, 177, 175, 1, 0, 0, 0, 177, 178, 1, 0, 0, 0, 178, 180, 1, 0, 0, 0, 179, 177, 1, 0, 0, 0, 180, 181, 5, 0, 0, 1, 181, 1, 1, 0, 0, 0, 182, 185, 3, 6, 3, 0, 183, 185, 3, 10, 5, 0, 184, 182, 1, 0, 0, 0, 184, 183, 1, 0, 0, 0, 185, 3, 1, 0, 0, 0, 186, 187, 3, 118, 59, 0, 187, 5, 1, 0, 0, 0, 188, 189, 5, 55, 0, 0, 189, 193, 3, 158, 79, 0, 190, 191, 5, 118, 0, 0, 191, 192, 5, 125, 0, 0, 192, 194, 3, 4, 2, 0, 193, 190, 1, 0, 0, 0, 193, 194, 1, 0, 0, 0, 194, 7, 1, 0, 0, 0, 195, 200, 3, 158, 79, 0, 196, 197, 5, 119, 0, 0, 197, 199, 3, 158, 79, 0, 198, 196, 1, 0, 0, 0, 199, 202, 1, 0, 0, 0, 200, 198, 1, 0, 0, 0, 200, 201, 1, 0, 0, 0, 201, 204, 1, 0, 0, 0, 202, 200, 1, 0, 0, 0, 203, 205, 5, 119, 0, 0, 204, 203, 1, 0, 0, 0, 204, 205, 1, 0, 0, 0, 205, 9, 1, 0, 0, 0, 206, 219, 3, 12, 6, 0, 207, 219, 3, 14, 7, 0, 208, 219, 3, 18, 9, 0, 209, 219, 3, 20, 10, 0, 210, 219, 3, 22, 11, 0, 211, 219, 3, 26, 13, 0, 212, 219, 3, 24, 12, 0, 213, 219, 3, 28, 14, 0, 214, 219, 3, 30, 15, 0, 215, 219, 3, 36, 18, 0, 216, 219, 3, 32, 16, 0, 217, 219, 3, 34, 17, 0, 218, 206, 1, 0, 0, 0, 218, 207, 1, 0, 0, 0, 218, 208, 1, 0, 0, 0, 218, 209, 1, 0, 0, 0, 218, 210, 1, 0, 0, 0, 218, 211, 1, 0, 0, 0, 218, 212, 1, 0, 0, 0, 218, 213, 1, 0, 0, 0, 218, 214, 1, 0, 0, 0, 218, 215, 1, 0, 0, 0, 218, 216, 1, 0, 0, 0, 218, 217, 1, 0, 0, 0, 219, 11, 1, 0, 0, 0, 220, 222, 5, 75, 0, 0, 221, 223, 3, 4, 2, 0, 222, 221, 1, 0, 0, 0, 222, 223, 1, 0, 0, 0, 223, 225, 1, 0, 0, 0, 224, 226, 5, 153, 0, 0, 225, 224, 1, 0, 0, 0, 225, 226, 1, 0, 0, 0, 226, 13, 1, 0, 0, 0, 227, 229, 5, 87, 0, 0, 228, 230, 3, 4, 2, 0, 229, 228, 1, 0, 0, 0, 229, 230, 1, 0, 0, 0, 230, 232, 1, 0, 0, 0, 231, 233, 5, 153, 0, 0, 232, 231, 1, 0, 0, 0, 232, 233, 1, 0, 0, 0, 233, 15, 1, 0, 0, 0, 234, 243, 5, 14, 0, 0, 235, 236, 5, 133, 0, 0, 236, 239, 3, 158, 79, 0, 237, 238, 5, 118, 0, 0, 238, 240, 3, 158, 79, 0, 239, 237, 1, 0, 0, 0, 239, 240, 1, 0, 0, 0, 240, 241, 1, 0, 0, 0, 241, 242, 5, 152, 0, 0, 242, 244, 1, 0, 0, 0, 243, 235, 1, 0, 0, 0, 243, 244, 1, 0, 0, 0, 244, 245, 1, 0, 0, 0, 245, 246, 3, 36, 18, 0, 246, 17, 1, 0, 0, 0, 247, 248, 5, 96, 0, 0, 248, 252, 3, 36, 18, 0, 249, 251, 3, 16, 8, 0, 250, 249, 1, 0, 0, 0, 251, 254, 1, 0, 0, 0, 252, 250, 1, 0, 0, 0, 252, 253, 1, 0, 0, 0, 253, 257, 1, 0, 0, 0, 254, 252, 1, 0, 0, 0, 255, 256, 5, 30, 0, 0, 256, 258, 3, 36, 18, 0, 257, 255, 1, 0, 0, 0, 257, 258, 1, 0, 0, 0, 258, 19, 1, 0, 0, 0, 259, 260, 5, 42, 0, 0, 260, 261, 5, 133, 0, 0, 261, 262, 3, 4, 2, 0, 262, 263, 5, 152, 0, 0, 263, 266, 3, 10, 5, 0, 264, 265, 5, 25, 0, 0, 265, 267, 3, 10, 5, 0, 266, 264, 1, 0, 0, 0, 266, 267, 1, 0, 0, 0, 267, 21, 1, 0, 0, 0, 268, 269, 5, 103, 0, 0, 269, 270, 5, 133, 0, 0, 270, 271, 3, 4, 2, 0, 271, 272, 5, 152, 0, 0, 272, 274, 3, 10, 5, 0, 273, 275, 5, 153, 0, 0, 274, 273, 1, 0, 0, 0, 274, 275, 1, 0, 0, 0, 275, 23, 1, 0, 0, 0, 276, 277, 5, 34, 0, 0, 277, 281, 5, 133, 0, 0, 278, 282, 3, 6, 3, 0, 279, 282, 3, 30, 15, 0, 280, 282, 3, 4, 2, 0, 281, 278, 1, 0, 0, 0, 281, 279, 1, 0, 0, 0, 281, 280, 1, 0, 0, 0, 281, 282, 1, 0, 0, 0, 282, 283, 1, 0, 0, 0, 283, 285, 5, 153, 0, 0, 284, 286, 3, 4, 2, 0, 285, 284, 1, 0, 0, 0, 285, 286, 1, 0, 0, 0, 286, 287, 1, 0, 0, 0, 287, 291, 5, 153, 0, 0, 288, 292, 3, 6, 3, 0, 289, 292, 3, 30, 15, 0, 290, 292, 3, 4, 2, 0, 291, 288, 1, 0, 0, 0, 291, 289, 1, 0, 0, 0, 291, 290, 1, 0, 0, 0, 291, 292, 1, 0, 0, 0, 292, 293, 1, 0, 0, 0, 293, 294, 5, 152, 0, 0, 294, 296, 3, 10, 5, 0, 295, 297, 5, 153, 0, 0, 296, 295, 1, 0, 0, 0, 296, 297, 1, 0, 0, 0, 297, 25, 1, 0, 0, 0, 298, 299, 5, 34, 0, 0, 299, 300, 5, 133, 0, 0, 300, 301, 5, 55, 0, 0, 301, 304, 3, 158, 79, 0, 302, 303, 5, 119, 0, 0, 303, 305, 3, 158, 79, 0, 304, 302, 1, 0, 0, 0, 304, 305, 1, 0, 0, 0, 305, 306, 1, 0, 0, 0, 306, 307, 5, 44, 0, 0, 307, 308, 3, 4, 2, 0, 308, 309, 5, 152, 0, 0, 309, 311, 3, 10, 5, 0, 310, 312, 5, 153, 0, 0, 311, 310, 1, 0, 0, 0, 311, 312, 1, 0, 0, 0, 312, 27, 1, 0, 0, 0, 313, 314, 7, 0, 0, 0, 314, 315, 3, 158, 79, 0, 315, 317, 5, 133, 0, 0, 316, 318, 3, 8, 4, 0, 317, 316, 1, 0, 0, 0, 317, 318, 1, 0, 0, 0, 318, 319, 1, 0, 0, 0, 319, 320, 5, 152, 0, 0, 320, 321, 3, 36, 18, 0, 321, 29, 1, 0, 0, 0, 322, 323, 3, 4, 2, 0, 323, 324, 5, 118, 0, 0, 324, 325, 5, 125, 0, 0, 325, 326, 3, 4, 2, 0, 326, 31, 1, 0, 0, 0, 327, 329, 3, 4, 2, 0, 328, 330, 5, 153, 0, 0, 329, 328, 1, 0, 0, 0, 329, 330, 1, 0, 0, 0, 330, 33, 1, 0, 0, 0, 331, 332, 5, 153, 0, 0, 332, 35, 1, 0, 0, 0, 333, 337, 5, 131, 0, 0, 334, 336, 3, 2, 1, 0, 335, 334, 1, 0, 0, 0, 336, 339, 1, 0, 0, 0, 337, 335, 1, 0, 0, 0, 337, 338, 1, 0, 0, 0, 338, 340, 1, 0, 0, 0, 339, 337, 1, 0, 0, 0, 340, 341, 5, 150, 0, 0, 341, 37, 1, 0, 0, 0, 342, 343, 3, 4, 2, 0, 343, 344, 5, 118, 0, 0, 344, 345, 3, 4, 2, 0, 345, 39, 1, 0, 0, 0, 346, 351, 3, 38, 19, 0, 347, 348, 5, 119, 0, 0, 348, 350, 3, 38, 19, 0, 349, 347, 1, 0, 0, 0, 350, 353, 1, 0, 0, 0, 351, 349, 1, 0, 0, 0, 351, 352, 1, 0, 0, 0, 352, 355, 1, 0, 0, 0, 353, 351, 1, 0, 0, 0, 354, 356, 5, 119, 0, 0, 355, 354, 1, 0, 0, 0, 355, 356, 1, 0, 0, 0, 356, 41, 1, 0, 0, 0, 357, 361, 3, 48, 24, 0, 358, 361, 3, 50, 25, 0, 359, 361, 3, 122, 61, 0, 360, 357, 1, 0, 0, 0, 360, 358, 1, 0, 0, 0, 360, 359, 1, 0, 0, 0, 361, 362, 1, 0, 0, 0, 362, 363, 5, 0, 0, 1, 363, 43, 1, 0, 0, 0, 364, 371, 3, 50, 25, 0, 365, 366, 5, 133, 0, 0, 366, 367, 3, 48, 24, 0, 367, 368, 5, 152, 0, 0, 368, 371, 1, 0, 0, 0, 369, 371, 3, 162, 81, 0, 370, 364, 1, 0, 0, 0, 370, 365, 1, 0, 0, 0, 370, 369, 1, 0, 0, 0, 371, 45, 1, 0, 0, 0, 372, 377, 5, 27, 0, 0, 373, 374, 5, 98, 0, 0, 374, 377, 5, 1, 0, 0, 375, 377, 5, 47, 0, 0, 376, 372, 1, 0, 0, 0, 376, 373, 1, 0, 0, 0, 376, 375, 1, 0, 0, 0, 377, 378, 1, 0, 0, 0, 378, 379, 3, 44, 22, 0, 379, 47, 1, 0, 0, 0, 380, 384, 3, 44, 22, 0, 381, 383, 3, 46, 23, 0, 382, 381, 1, 0, 0, 0, 383, 386, 1, 0, 0, 0, 384, 382, 1, 0, 0, 0, 384, 385, 1, 0, 0, 0, 385, 49, 1, 0, 0, 0, 386, 384, 1, 0, 0, 0, 387, 389, 3, 52, 26, 0, 388, 387, 1, 0, 0, 0, 388, 389, 1, 0, 0, 0, 389, 390, 1, 0, 0, 0, 390, 392, 5, 82, 0, 0, 391, 393, 5, 24, 0, 0, 392, 391, 1, 0, 0, 0, 392, 393, 1, 0, 0, 0, 393, 395, 1, 0, 0, 0, 394, 396, 3, 54, 27, 0, 395, 394, 1, 0, 0, 0, 395, 396, 1, 0, 0, 0, 396, 397, 1, 0, 0, 0, 397, 399, 3, 116, 58, 0, 398, 400, 3, 56, 28, 0, 399, 398, 1, 0, 0, 0, 399, 400, 1, 0, 0, 0, 400, 402, 1, 0, 0, 0, 401, 403, 3, 58, 29, 0, 402, 401, 1, 0, 0, 0, 402, 403, 1, 0, 0, 0, 403, 405, 1, 0, 0, 0, 404, 406, 3, 62, 31, 0, 405, 404, 1, 0, 0, 0, 405, 406, 1, 0, 0, 0, 406, 408, 1, 0, 0, 0, 407, 409, 3, 64, 32, 0, 408, 407, 1, 0, 0, 0, 408, 409, 1, 0, 0, 0, 409, 411, 1, 0, 0, 0, 410, 412, 3, 66, 33, 0, 411, 410, 1, 0, 0, 0, 411, 412, 1, 0, 0, 0, 412, 415, 1, 0, 0, 0, 413, 414, 5, 105, 0, 0, 414, 416, 7, 1, 0, 0, 415, 413, 1, 0, 0, 0, 415, 416, 1, 0, 0, 0, 416, 419, 1, 0, 0, 0, 417, 418, 5, 105, 0, 0, 418, 420, 5, 92, 0, 0, 419, 417, 1, 0, 0, 0, 419, 420, 1, 0, 0, 0, 420, 422, 1, 0, 0, 0, 421, 423, 3, 68, 34, 0, 422, 421, 1, 0, 0, 0, 422, 423, 1, 0, 0, 0, 423, 425, 1, 0, 0, 0, 424, 426, 3, 60, 30, 0, 425, 424, 1, 0, 0, 0, 425, 426, 1, 0, 0, 0, 426, 428, 1, 0, 0, 0, 427, 429, 3, 70, 35, 0, 428, 427, 1, 0, 0, 0, 428, 429, 1, 0, 0, 0, 429, 432, 1, 0, 0, 0, 430, 433, 3, 74, 37, 0, 431, 433, 3, 76, 38, 0, 432, 430, 1, 0, 0, 0, 432, 431, 1, 0, 0, 0, 432, 433, 1, 0, 0, 0, 433, 435, 1, 0, 0, 0, 434, 436, 3, 78, 39, 0, 435, 434, 1, 0, 0, 0, 435, 436, 1, 0, 0, 0, 436, 51, 1, 0, 0, 0, 437, 438, 5, 105, 0, 0, 438, 439, 3, 126, 63, 0, 439, 53, 1, 0, 0, 0, 440, 441, 5, 91, 0, 0, 441, 444, 5, 111, 0, 0, 442, 443, 5, 105, 0, 0, 443, 445, 5, 88, 0, 0, 444, 442, 1, 0, 0, 0, 444, 445, 1, 0, 0, 0, 445, 55, 1, 0, 0, 0, 446, 447, 5, 35, 0, 0, 447, 448, 3, 80, 40, 0, 448, 57, 1, 0, 0, 0, 449, 451, 7, 2, 0, 0, 450, 449, 1, 0, 0, 0, 450, 451, 1, 0, 0, 0, 451, 452, 1, 0, 0, 0, 452, 453, 5, 5, 0, 0, 453, 454, 5, 50, 0, 0, 454, 455, 3, 116, 58, 0, 455, 59, 1, 0, 0, 0, 456, 457, 5, 104, 0, 0, 457, 458, 3, 158, 79, 0, 458, 459, 5, 6, 0, 0, 459, 460, 5, 133, 0, 0, 460, 461, 3, 100, 50, 0, 461, 471, 5, 152, 0, 0, 462, 463, 5, 119, 0, 0, 463, 464, 3, 158, 79, 0, 464, 465, 5, 6, 0, 0, 465, 466, 5, 133, 0, 0, 466, 467, 3, 100, 50, 0, 467, 468, 5, 152, 0, 0, 468, 470, 1, 0, 0, 0, 469, 462, 1, 0, 0, 0, 470, 473, 1, 0, 0, 0, 471, 469, 1, 0, 0, 0, 471, 472, 1, 0, 0, 0, 472, 61, 1, 0, 0, 0, 473, 471, 1, 0, 0, 0, 474, 475, 5, 72, 0, 0, 475, 476, 3, 118, 59, 0, 476, 63, 1, 0, 0, 0, 477, 478, 5, 102, 0, 0, 478, 479, 3, 118, 59, 0, 479, 65, 1, 0, 0, 0, 480, 481, 5, 38, 0, 0, 481, 488, 5, 11, 0, 0, 482, 483, 7, 1, 0, 0, 483, 484, 5, 133, 0, 0, 484, 485, 3, 116, 58, 0, 485, 486, 5, 152, 0, 0, 486, 489, 1, 0, 0, 0, 487, 489, 3, 116, 58, 0, 488, 482, 1, 0, 0, 0, 488, 487, 1, 0, 0, 0, 489, 67, 1, 0, 0, 0, 490, 491, 5, 39, 0, 0, 491, 492, 3, 118, 59, 0, 492, 69, 1, 0, 0, 0, 493, 494, 5, 67, 0, 0, 494, 495, 5, 11, 0, 0, 495, 496, 3, 90, 45, 0, 496, 71, 1, 0, 0, 0, 497, 498, 5, 67, 0, 0, 498, 499, 5, 11, 0, 0, 499, 500, 3, 116, 58, 0, 500, 73, 1, 0, 0, 0, 501, 502, 5, 57, 0, 0, 502, 505, 3, 118, 59, 0, 503, 504, 5, 119, 0, 0, 504, 506, 3, 118, 59, 0, 505, 503, 1, 0, 0, 0, 505, 506, 1, 0, 0, 0, 506, 511, 1, 0, 0, 0, 507, 508, 5, 105, 0, 0, 508, 512, 5, 88, 0, 0, 509, 510, 5, 11, 0, 0, 510, 512, 3, 116, 58, 0, 511, 507, 1, 0, 0, 0, 511, 509, 1, 0, 0, 0, 511, 512, 1, 0, 0, 0, 512, 531, 1, 0, 0, 0, 513, 514, 5, 57, 0, 0, 514, 517, 3, 118, 59, 0, 515, 516, 5, 105, 0, 0, 516, 518, 5, 88, 0, 0, 517, 515, 1, 0, 0, 0, 517, 518, 1, 0, 0, 0, 518, 519, 1, 0, 0, 0, 519, 520, 5, 64, 0, 0, 520, 521, 3, 118, 59, 0, 521, 531, 1, 0, 0, 0, 522, 523, 5, 57, 0, 0, 523, 524, 3, 118, 59, 0, 524, 525, 5, 64, 0, 0, 525, 528, 3, 118, 59, 0, 526, 527, 5, 11, 0, 0, 527, 529, 3, 116, 58, 0, 528, 526, 1, 0, 0, 0, 528, 529, 1, 0, 0, 0, 529, 531, 1, 0, 0, 0, 530, 501, 1, 0, 0, 0, 530, 513, 1, 0, 0, 0, 530, 522, 1, 0, 0, 0, 531, 75, 1, 0, 0, 0, 532, 533, 5, 64, 0, 0, 533, 534, 3, 118, 59, 0, 534, 77, 1, 0, 0, 0, 535, 536, 5, 84, 0, 0, 536, 537, 3, 96, 48, 0, 537, 79, 1, 0, 0, 0, 538, 539, 6, 40, -1, 0, 539, 541, 3, 134, 67, 0, 540, 542, 5, 29, 0, 0, 541, 540, 1, 0, 0, 0, 541, 542, 1, 0, 0, 0, 542, 544, 1, 0, 0, 0, 543, 545, 3, 88, 44, 0, 544, 543, 1, 0, 0, 0, 544, 545, 1, 0, 0, 0, 545, 551, 1, 0, 0, 0, 546, 547, 5, 133, 0, 0, 547, 548, 3, 80, 40, 0, 548, 549, 5, 152, 0, 0, 549, 551, 1, 0, 0, 0, 550, 538, 1, 0, 0, 0, 550, 546, 1, 0, 0, 0, 551, 566, 1, 0, 0, 0, 552, 553, 10, 3, 0, 0, 553, 554, 3, 84, 42, 0, 554, 555, 3, 80, 40, 4, 555, 565, 1, 0, 0, 0, 556, 558, 10, 4, 0, 0, 557, 559, 3, 82, 41, 0, 558, 557, 1, 0, 0, 0, 558, 559, 1, 0, 0, 0, 559, 560, 1, 0, 0, 0, 560, 561, 5, 50, 0, 0, 561, 562, 3, 80, 40, 0, 562, 563, 3, 86, 43, 0, 563, 565, 1, 0, 0, 0, 564, 552, 1, 0, 0, 0, 564, 556, 1, 0, 0, 0, 565, 568, 1, 0, 0, 0, 566, 564, 1, 0, 0, 0, 566, 567, 1, 0, 0, 0, 567, 81, 1, 0, 0, 0, 568, 566, 1, 0, 0, 0, 569, 571, 7, 3, 0, 0, 570, 569, 1, 0, 0, 0, 570, 571, 1, 0, 0, 0, 571, 572, 1, 0, 0, 0, 572, 579, 5, 46, 0, 0, 573, 575, 5, 46, 0, 0, 574, 576, 7, 3, 0, 0, 575, 574, 1, 0, 0, 0, 575, 576, 1, 0, 0, 0, 576, 579, 1, 0, 0, 0, 577, 579, 7, 3, 0, 0, 578, 570, 1, 0, 0, 0, 578, 573, 1, 0, 0, 0, 578, 577, 1, 0, 0, 0, 579, 613, 1, 0, 0, 0, 580, 582, 7, 4, 0, 0, 581, 580, 1, 0, 0, 0, 581, 582, 1, 0, 0, 0, 582, 583, 1, 0, 0, 0, 583, 585, 7, 5, 0, 0, 584, 586, 5, 68, 0, 0, 585, 584, 1, 0, 0, 0, 585, 586, 1, 0, 0, 0, 586, 595, 1, 0, 0, 0, 587, 589, 7, 5, 0, 0, 588, 590, 5, 68, 0, 0, 589, 588, 1, 0, 0, 0, 589, 590, 1, 0, 0, 0, 590, 592, 1, 0, 0, 0, 591, 593, 7, 4, 0, 0, 592, 591, 1, 0, 0, 0, 592, 593, 1, 0, 0, 0, 593, 595, 1, 0, 0, 0, 594, 581, 1, 0, 0, 0, 594, 587, 1, 0, 0, 0, 595, 613, 1, 0, 0, 0, 596, 598, 7, 6, 0, 0, 597, 596, 1, 0, 0, 0, 597, 598, 1, 0, 0, 0, 598, 599, 1, 0, 0, 0, 599, 601, 5, 36, 0, 0, 600, 602, 5, 68, 0, 0, 601, 600, 1, 0, 0, 0, 601, 602, 1, 0, 0, 0, 602, 611, 1, 0, 0, 0, 603, 605, 5, 36, 0, 0, 604, 606, 5, 68, 0, 0, 605, 604, 1, 0, 0, 0, 605, 606, 1, 0, 0, 0, 606, 608, 1, 0, 0, 0, 607, 609, 7, 6, 0, 0, 608, 607, 1, 0, 0, 0, 608, 609, 1, 0, 0, 0, 609, 611, 1, 0, 0, 0, 610, 597, 1, 0, 0, 0, 610, 603, 1, 0, 0, 0, 611, 613, 1, 0, 0, 0, 612, 578, 1, 0, 0, 0, 612, 594, 1, 0, 0, 0, 612, 610, 1, 0, 0, 0, 613, 83, 1, 0, 0, 0, 614, 615, 5, 17, 0, 0, 615, 618, 5, 50, 0, 0, 616, 618, 5, 119, 0, 0, 617, 614, 1, 0, 0, 0, 617, 616, 1, 0, 0, 0, 618, 85, 1, 0, 0, 0, 619, 620, 5, 65, 0, 0, 620, 629, 3, 116, 58, 0, 621, 622, 5, 99, 0, 0, 622, 623, 5, 133, 0, 0, 623, 624, 3, 116, 58, 0, 624, 625, 5, 152, 0, 0, 625, 629, 1, 0, 0, 0, 626, 627, 5, 99, 0, 0, 627, 629, 3, 116, 58, 0, 628, 619, 1, 0, 0, 0, 628, 621, 1, 0, 0, 0, 628, 626, 1, 0, 0, 0, 629, 87, 1, 0, 0, 0, 630, 631, 5, 80, 0, 0, 631, 634, 3, 94, 47, 0, 632, 633, 5, 64, 0, 0, 633, 635, 3, 94, 47, 0, 634, 632, 1, 0, 0, 0, 634, 635, 1, 0, 0, 0, 635, 89, 1, 0, 0, 0, 636, 641, 3, 92, 46, 0, 637, 638, 5, 119, 0, 0, 638, 640, 3, 92, 46, 0, 639, 637, 1, 0, 0, 0, 640, 643, 1, 0, 0, 0, 641, 639, 1, 0, 0, 0, 641, 642, 1, 0, 0, 0, 642, 91, 1, 0, 0, 0, 643, 641, 1, 0, 0, 0, 644, 646, 3, 118, 59, 0, 645, 647, 7, 7, 0, 0, 646, 645, 1, 0, 0, 0, 646, 647, 1, 0, 0, 0, 647, 650, 1, 0, 0, 0, 648, 649, 5, 63, 0, 0, 649, 651, 7, 8, 0, 0, 650, 648, 1, 0, 0, 0, 650, 651, 1, 0, 0, 0, 651, 654, 1, 0, 0, 0, 652, 653, 5, 16, 0, 0, 653, 655, 5, 113, 0, 0, 654, 652, 1, 0, 0, 0, 654, 655, 1, 0, 0, 0, 655, 93, 1, 0, 0, 0, 656, 663, 3, 162, 81, 0, 657, 660, 3, 146, 73, 0, 658, 659, 5, 154, 0, 0, 659, 661, 3, 146, 73, 0, 660, 658, 1, 0, 0, 0, 660, 661, 1, 0, 0, 0, 661, 663, 1, 0, 0, 0, 662, 656, 1, 0, 0, 0, 662, 657, 1, 0, 0, 0, 663, 95, 1, 0, 0, 0, 664, 669, 3, 98, 49, 0, 665, 666, 5, 119, 0, 0, 666, 668, 3, 98, 49, 0, 667, 665, 1, 0, 0, 0, 668, 671, 1, 0, 0, 0, 669, 667, 1, 0, 0, 0, 669, 670, 1, 0, 0, 0, 670, 97, 1, 0, 0, 0, 671, 669, 1, 0, 0, 0, 672, 673, 3, 158, 79, 0, 673, 674, 5, 125, 0, 0, 674, 675, 3, 148, 74, 0, 675, 99, 1, 0, 0, 0, 676, 678, 3, 102, 51, 0, 677, 676, 1, 0, 0, 0, 677, 678, 1, 0, 0, 0, 678, 680, 1, 0, 0, 0, 679, 681, 3, 104, 52, 0, 680, 679, 1, 0, 0, 0, 680, 681, 1, 0, 0, 0, 681, 683, 1, 0, 0, 0, 682, 684, 3, 106, 53, 0, 683, 682, 1, 0, 0, 0, 683, 684, 1, 0, 0, 0, 684, 101, 1, 0, 0, 0, 685, 686, 5, 70, 0, 0, 686, 687, 5, 11, 0, 0, 687, 688, 3, 116, 58, 0, 688, 103, 1, 0, 0, 0, 689, 690, 5, 67, 0, 0, 690, 691, 5, 11, 0, 0, 691, 692, 3, 90, 45, 0, 692, 105, 1, 0, 0, 0, 693, 694, 7, 9, 0, 0, 694, 695, 3, 108, 54, 0, 695, 107, 1, 0, 0, 0, 696, 703, 3, 110, 55, 0, 697, 698, 5, 9, 0, 0, 698, 699, 3, 110, 55, 0, 699, 700, 5, 2, 0, 0, 700, 701, 3, 110, 55, 0, 701, 703, 1, 0, 0, 0, 702, 696, 1, 0, 0, 0, 702, 697, 1, 0, 0, 0, 703, 109, 1, 0, 0, 0, 704, 705, 5, 19, 0, 0, 705, 717, 5, 78, 0, 0, 706, 707, 5, 97, 0, 0, 707, 717, 5, 71, 0, 0, 708, 709, 5, 97, 0, 0, 709, 717, 5, 33, 0, 0, 710, 711, 3, 146, 73, 0, 711, 712, 5, 71, 0, 0, 712, 717, 1, 0, 0, 0, 713, 714, 3, 146, 73, 0, 714, 715, 5, 33, 0, 0, 715, 717, 1, 0, 0, 0, 716, 704, 1, 0, 0, 0, 716, 706, 1, 0, 0, 0, 716, 708, 1, 0, 0, 0, 716, 710, 1, 0, 0, 0, 716, 713, 1, 0, 0, 0, 717, 111, 1, 0, 0, 0, 718, 719, 3, 118, 59, 0, 719, 720, 5, 0, 0, 1, 720, 113, 1, 0, 0, 0, 721, 778, 3, 158, 79, 0, 722, 723, 3, 158, 79, 0, 723, 724, 5, 133, 0, 0, 724, 725, 3, 158, 79, 0, 725, 732, 3, 114, 57, 0, 726, 727, 5, 119, 0, 0, 727, 728, 3, 158, 79, 0, 728, 729, 3, 114, 57, 0, 729, 731, 1, 0, 0, 0, 730, 726, 1, 0, 0, 0, 731, 734, 1, 0, 0, 0, 732, 730, 1, 0, 0, 0, 732, 733, 1, 0, 0, 0, 733, 736, 1, 0, 0, 0, 734, 732, 1, 0, 0, 0, 735, 737, 5, 119, 0, 0, 736, 735, 1, 0, 0, 0, 736, 737, 1, 0, 0, 0, 737, 738, 1, 0, 0, 0, 738, 739, 5, 152, 0, 0, 739, 778, 1, 0, 0, 0, 740, 741, 3, 158, 79, 0, 741, 742, 5, 133, 0, 0, 742, 747, 3, 160, 80, 0, 743, 744, 5, 119, 0, 0, 744, 746, 3, 160, 80, 0, 745, 743, 1, 0, 0, 0, 746, 749, 1, 0, 0, 0, 747, 745, 1, 0, 0, 0, 747, 748, 1, 0, 0, 0, 748, 751, 1, 0, 0, 0, 749, 747, 1, 0, 0, 0, 750, 752, 5, 119, 0, 0, 751, 750, 1, 0, 0, 0, 751, 752, 1, 0, 0, 0, 752, 753, 1, 0, 0, 0, 753, 754, 5, 152, 0, 0, 754, 778, 1, 0, 0, 0, 755, 756, 3, 158, 79, 0, 756, 757, 5, 133, 0, 0, 757, 762, 3, 114, 57, 0, 758, 759, 5, 119, 0, 0, 759, 761, 3, 114, 57, 0, 760, 758, 1, 0, 0, 0, 761, 764, 1, 0, 0, 0, 762, 760, 1, 0, 0, 0, 762, 763, 1, 0, 0, 0, 763, 766, 1, 0, 0, 0, 764, 762, 1, 0, 0, 0, 765, 767, 5, 119, 0, 0, 766, 765, 1, 0, 0, 0, 766, 767, 1, 0, 0, 0, 767, 768, 1, 0, 0, 0, 768, 769, 5, 152, 0, 0, 769, 778, 1, 0, 0, 0, 770, 771, 3, 158, 79, 0, 771, 773, 5, 133, 0, 0, 772, 774, 3, 116, 58, 0, 773, 772, 1, 0, 0, 0, 773, 774, 1, 0, 0, 0, 774, 775, 1, 0, 0, 0, 775, 776, 5, 152, 0, 0, 776, 778, 1, 0, 0, 0, 777, 721, 1, 0, 0, 0, 777, 722, 1, 0, 0, 0, 777, 740, 1, 0, 0, 0, 777, 755, 1, 0, 0, 0, 777, 770, 1, 0, 0, 0, 778, 115, 1, 0, 0, 0, 779, 784, 3, 118, 59, 0, 780, 781, 5, 119, 0, 0, 781, 783, 3, 118, 59, 0, 782, 780, 1, 0, 0, 0, 783, 786, 1, 0, 0, 0, 784, 782, 1, 0, 0, 0, 784, 785, 1, 0, 0, 0, 785, 788, 1, 0, 0, 0, 786, 784, 1, 0, 0, 0, 787, 789, 5, 119, 0, 0, 788, 787, 1, 0, 0, 0, 788, 789, 1, 0, 0, 0, 789, 117, 1, 0, 0, 0, 790, 791, 6, 59, -1, 0, 791, 793, 5, 12, 0, 0, 792, 794, 3, 118, 59, 0, 793, 792, 1, 0, 0, 0, 793, 794, 1, 0, 0, 0, 794, 800, 1, 0, 0, 0, 795, 796, 5, 101, 0, 0, 796, 797, 3, 118, 59, 0, 797, 798, 5, 86, 0, 0, 798, 799, 3, 118, 59, 0, 799, 801, 1, 0, 0, 0, 800, 795, 1, 0, 0, 0, 801, 802, 1, 0, 0, 0, 802, 800, 1, 0, 0, 0, 802, 803, 1, 0, 0, 0, 803, 806, 1, 0, 0, 0, 804, 805, 5, 25, 0, 0, 805, 807, 3, 118, 59, 0, 806, 804, 1, 0, 0, 0, 806, 807, 1, 0, 0, 0, 807, 808, 1, 0, 0, 0, 808, 809, 5, 26, 0, 0, 809, 941, 1, 0, 0, 0, 810, 811, 5, 13, 0, 0, 811, 812, 5, 133, 0, 0, 812, 813, 3, 118, 59, 0, 813, 814, 5, 6, 0, 0, 814, 815, 3, 114, 57, 0, 815, 816, 5, 152, 0, 0, 816, 941, 1, 0, 0, 0, 817, 818, 5, 20, 0, 0, 818, 941, 5, 113, 0, 0, 819, 820, 5, 48, 0, 0, 820, 821, 3, 118, 59, 0, 821, 822, 3, 150, 75, 0, 822, 941, 1, 0, 0, 0, 823, 824, 5, 85, 0, 0, 824, 825, 5, 133, 0, 0, 825, 826, 3, 118, 59, 0, 826, 827, 5, 35, 0, 0, 827, 830, 3, 118, 59, 0, 828, 829, 5, 34, 0, 0, 829, 831, 3, 118, 59, 0, 830, 828, 1, 0, 0, 0, 830, 831, 1, 0, 0, 0, 831, 832, 1, 0, 0, 0, 832, 833, 5, 152, 0, 0, 833, 941, 1, 0, 0, 0, 834, 835, 5, 89, 0, 0, 835, 941, 5, 113, 0, 0, 836, 837, 5, 94, 0, 0, 837, 838, 5, 133, 0, 0, 838, 839, 7, 10, 0, 0, 839, 840, 3, 164, 82, 0, 840, 841, 5, 35, 0, 0, 841, 842, 3, 118, 59, 0, 842, 843, 5, 152, 0, 0, 843, 941, 1, 0, 0, 0, 844, 845, 3, 158, 79, 0, 845, 847, 5, 133, 0, 0, 846, 848, 3, 116, 58, 0, 847, 846, 1, 0, 0, 0, 847, 848, 1, 0, 0, 0, 848, 849, 1, 0, 0, 0, 849, 850, 5, 152, 0, 0, 850, 859, 1, 0, 0, 0, 851, 853, 5, 133, 0, 0, 852, 854, 5, 24, 0, 0, 853, 852, 1, 0, 0, 0, 853, 854, 1, 0, 0, 0, 854, 856, 1, 0, 0, 0, 855, 857, 3, 116, 58, 0, 856, 855, 1, 0, 0, 0, 856, 857, 1, 0, 0, 0, 857, 858, 1, 0, 0, 0, 858, 860, 5, 152, 0, 0, 859, 851, 1, 0, 0, 0, 859, 860, 1, 0, 0, 0, 860, 861, 1, 0, 0, 0, 861, 862, 5, 69, 0, 0, 862, 863, 5, 133, 0, 0, 863, 864, 3, 100, 50, 0, 864, 865, 5, 152, 0, 0, 865, 941, 1, 0, 0, 0, 866, 867, 3, 158, 79, 0, 867, 869, 5, 133, 0, 0, 868, 870, 3, 116, 58, 0, 869, 868, 1, 0, 0, 0, 869, 870, 1, 0, 0, 0, 870, 871, 1, 0, 0, 0, 871, 872, 5, 152, 0, 0, 872, 881, 1, 0, 0, 0, 873, 875, 5, 133, 0, 0, 874, 876, 5, 24, 0, 0, 875, 874, 1, 0, 0, 0, 875, 876, 1, 0, 0, 0, 876, 878, 1, 0, 0, 0, 877, 879, 3, 116, 58, 0, 878, 877, 1, 0, 0, 0, 878, 879, 1, 0, 0, 0, 879, 880, 1, 0, 0, 0, 880, 882, 5, 152, 0, 0, 881, 873, 1, 0, 0, 0, 881, 882, 1, 0, 0, 0, 882, 883, 1, 0, 0, 0, 883, 884, 5, 69, 0, 0, 884, 885, 3, 158, 79, 0, 885, 941, 1, 0, 0, 0, 886, 892, 3, 158, 79, 0, 887, 889, 5, 133, 0, 0, 888, 890, 3, 116, 58, 0, 889, 888, 1, 0, 0, 0, 889, 890, 1, 0, 0, 0, 890, 891, 1, 0, 0, 0, 891, 893, 5, 152, 0, 0, 892, 887, 1, 0, 0, 0, 892, 893, 1, 0, 0, 0, 893, 894, 1, 0, 0, 0, 894, 896, 5, 133, 0, 0, 895, 897, 5, 24, 0, 0, 896, 895, 1, 0, 0, 0, 896, 897, 1, 0, 0, 0, 897, 899, 1, 0, 0, 0, 898, 900, 3, 116, 58, 0, 899, 898, 1, 0, 0, 0, 899, 900, 1, 0, 0, 0, 900, 901, 1, 0, 0, 0, 901, 902, 5, 152, 0, 0, 902, 941, 1, 0, 0, 0, 903, 941, 3, 122, 61, 0, 904, 941, 3, 166, 83, 0, 905, 941, 3, 148, 74, 0, 906, 907, 5, 121, 0, 0, 907, 941, 3, 118, 59, 20, 908, 909, 5, 61, 0, 0, 909, 941, 3, 118, 59, 14, 910, 911, 3, 138, 69, 0, 911, 912, 5, 123, 0, 0, 912, 914, 1, 0, 0, 0, 913, 910, 1, 0, 0, 0, 913, 914, 1, 0, 0, 0, 914, 915, 1, 0, 0, 0, 915, 941, 5, 115, 0, 0, 916, 917, 5, 133, 0, 0, 917, 918, 3, 48, 24, 0, 918, 919, 5, 152, 0, 0, 919, 941, 1, 0, 0, 0, 920, 921, 5, 133, 0, 0, 921, 922, 3, 118, 59, 0, 922, 923, 5, 152, 0, 0, 923, 941, 1, 0, 0, 0, 924, 925, 5, 133, 0, 0, 925, 926, 3, 116, 58, 0, 926, 927, 5, 152, 0, 0, 927, 941, 1, 0, 0, 0, 928, 930, 5, 132, 0, 0, 929, 931, 3, 116, 58, 0, 930, 929, 1, 0, 0, 0, 930, 931, 1, 0, 0, 0, 931, 932, 1, 0, 0, 0, 932, 941, 5, 151, 0, 0, 933, 935, 5, 131, 0, 0, 934, 936, 3, 40, 20, 0, 935, 934, 1, 0, 0, 0, 935, 936, 1, 0, 0, 0, 936, 937, 1, 0, 0, 0, 937, 941, 5, 150, 0, 0, 938, 941, 3, 120, 60, 0, 939, 941, 3, 130, 65, 0, 940, 790, 1, 0, 0, 0, 940, 810, 1, 0, 0, 0, 940, 817, 1, 0, 0, 0, 940, 819, 1, 0, 0, 0, 940, 823, 1, 0, 0, 0, 940, 834, 1, 0, 0, 0, 940, 836, 1, 0, 0, 0, 940, 844, 1, 0, 0, 0, 940, 866, 1, 0, 0, 0, 940, 886, 1, 0, 0, 0, 940, 903, 1, 0, 0, 0, 940, 904, 1, 0, 0, 0, 940, 905, 1, 0, 0, 0, 940, 906, 1, 0, 0, 0, 940, 908, 1, 0, 0, 0, 940, 913, 1, 0, 0, 0, 940, 916, 1, 0, 0, 0, 940, 920, 1, 0, 0, 0, 940, 924, 1, 0, 0, 0, 940, 928, 1, 0, 0, 0, 940, 933, 1, 0, 0, 0, 940, 938, 1, 0, 0, 0, 940, 939, 1, 0, 0, 0, 941, 1052, 1, 0, 0, 0, 942, 946, 10, 19, 0, 0, 943, 947, 5, 115, 0, 0, 944, 947, 5, 154, 0, 0, 945, 947, 5, 141, 0, 0, 946, 943, 1, 0, 0, 0, 946, 944, 1, 0, 0, 0, 946, 945, 1, 0, 0, 0, 947, 948, 1, 0, 0, 0, 948, 1051, 3, 118, 59, 20, 949, 953, 10, 18, 0, 0, 950, 954, 5, 142, 0, 0, 951, 954, 5, 121, 0, 0, 952, 954, 5, 120, 0, 0, 953, 950, 1, 0, 0, 0, 953, 951, 1, 0, 0, 0, 953, 952, 1, 0, 0, 0, 954, 955, 1, 0, 0, 0, 955, 1051, 3, 118, 59, 19, 956, 981, 10, 17, 0, 0, 957, 982, 5, 124, 0, 0, 958, 982, 5, 125, 0, 0, 959, 982, 5, 136, 0, 0, 960, 982, 5, 134, 0, 0, 961, 982, 5, 135, 0, 0, 962, 982, 5, 126, 0, 0, 963, 982, 5, 127, 0, 0, 964, 966, 5, 61, 0, 0, 965, 964, 1, 0, 0, 0, 965, 966, 1, 0, 0, 0, 966, 967, 1, 0, 0, 0, 967, 969, 5, 44, 0, 0, 968, 970, 5, 15, 0, 0, 969, 968, 1, 0, 0, 0, 969, 970, 1, 0, 0, 0, 970, 982, 1, 0, 0, 0, 971, 973, 5, 61, 0, 0, 972, 971, 1, 0, 0, 0, 972, 973, 1, 0, 0, 0, 973, 974, 1, 0, 0, 0, 974, 982, 7, 11, 0, 0, 975, 982, 5, 148, 0, 0, 976, 982, 5, 149, 0, 0, 977, 982, 5, 138, 0, 0, 978, 982, 5, 129, 0, 0, 979, 982, 5, 130, 0, 0, 980, 982, 5, 137, 0, 0, 981, 957, 1, 0, 0, 0, 981, 958, 1, 0, 0, 0, 981, 959, 1, 0, 0, 0, 981, 960, 1, 0, 0, 0, 981, 961, 1, 0, 0, 0, 981, 962, 1, 0, 0, 0, 981, 963, 1, 0, 0, 0, 981, 965, 1, 0, 0, 0, 981, 972, 1, 0, 0, 0, 981, 975, 1, 0, 0, 0, 981, 976, 1, 0, 0, 0, 981, 977, 1, 0, 0, 0, 981, 978, 1, 0, 0, 0, 981, 979, 1, 0, 0, 0, 981, 980, 1, 0, 0, 0, 982, 983, 1, 0, 0, 0, 983, 1051, 3, 118, 59, 18, 984, 985, 10, 15, 0, 0, 985, 986, 5, 140, 0, 0, 986, 1051, 3, 118, 59, 16, 987, 988, 10, 13, 0, 0, 988, 989, 5, 2, 0, 0, 989, 1051, 3, 118, 59, 14, 990, 991, 10, 12, 0, 0, 991, 992, 5, 66, 0, 0, 992, 1051, 3, 118, 59, 13, 993, 995, 10, 11, 0, 0, 994, 996, 5, 61, 0, 0, 995, 994, 1, 0, 0, 0, 995, 996, 1, 0, 0, 0, 996, 997, 1, 0, 0, 0, 997, 998, 5, 9, 0, 0, 998, 999, 3, 118, 59, 0, 999, 1000, 5, 2, 0, 0, 1000, 1001, 3, 118, 59, 12, 1001, 1051, 1, 0, 0, 0, 1002, 1003, 10, 10, 0, 0, 1003, 1004, 5, 143, 0, 0, 1004, 1005, 3, 118, 59, 0, 1005, 1006, 5, 118, 0, 0, 1006, 1007, 3, 118, 59, 10, 1007, 1051, 1, 0, 0, 0, 1008, 1009, 10, 30, 0, 0, 1009, 1011, 5, 133, 0, 0, 1010, 1012, 3, 116, 58, 0, 1011, 1010, 1, 0, 0, 0, 1011, 1012, 1, 0, 0, 0, 1012, 1013, 1, 0, 0, 0, 1013, 1051, 5, 152, 0, 0, 1014, 1015, 10, 26, 0, 0, 1015, 1016, 5, 132, 0, 0, 1016, 1017, 3, 118, 59, 0, 1017, 1018, 5, 151, 0, 0, 1018, 1051, 1, 0, 0, 0, 1019, 1020, 10, 25, 0, 0, 1020, 1021, 5, 123, 0, 0, 1021, 1051, 5, 111, 0, 0, 1022, 1023, 10, 24, 0, 0, 1023, 1024, 5, 123, 0, 0, 1024, 1051, 3, 158, 79, 0, 1025, 1026, 10, 23, 0, 0, 1026, 1027, 5, 139, 0, 0, 1027, 1028, 5, 132, 0, 0, 1028, 1029, 3, 118, 59, 0, 1029, 1030, 5, 151, 0, 0, 1030, 1051, 1, 0, 0, 0, 1031, 1032, 10, 22, 0, 0, 1032, 1033, 5, 139, 0, 0, 1033, 1051, 5, 111, 0, 0, 1034, 1035, 10, 21, 0, 0, 1035, 1036, 5, 139, 0, 0, 1036, 1051, 3, 158, 79, 0, 1037, 1038, 10, 16, 0, 0, 1038, 1040, 5, 49, 0, 0, 1039, 1041, 5, 61, 0, 0, 1040, 1039, 1, 0, 0, 0, 1040, 1041, 1, 0, 0, 0, 1041, 1042, 1, 0, 0, 0, 1042, 1051, 5, 62, 0, 0, 1043, 1048, 10, 9, 0, 0, 1044, 1045, 5, 6, 0, 0, 1045, 1049, 3, 158, 79, 0, 1046, 1047, 5, 6, 0, 0, 1047, 1049, 5, 113, 0, 0, 1048, 1044, 1, 0, 0, 0, 1048, 1046, 1, 0, 0, 0, 1049, 1051, 1, 0, 0, 0, 1050, 942, 1, 0, 0, 0, 1050, 949, 1, 0, 0, 0, 1050, 956, 1, 0, 0, 0, 1050, 984, 1, 0, 0, 0, 1050, 987, 1, 0, 0, 0, 1050, 990, 1, 0, 0, 0, 1050, 993, 1, 0, 0, 0, 1050, 1002, 1, 0, 0, 0, 1050, 1008, 1, 0, 0, 0, 1050, 1014, 1, 0, 0, 0, 1050, 1019, 1, 0, 0, 0, 1050, 1022, 1, 0, 0, 0, 1050, 1025, 1, 0, 0, 0, 1050, 1031, 1, 0, 0, 0, 1050, 1034, 1, 0, 0, 0, 1050, 1037, 1, 0, 0, 0, 1050, 1043, 1, 0, 0, 0, 1051, 1054, 1, 0, 0, 0, 1052, 1050, 1, 0, 0, 0, 1052, 1053, 1, 0, 0, 0, 1053, 119, 1, 0, 0, 0, 1054, 1052, 1, 0, 0, 0, 1055, 1056, 5, 133, 0, 0, 1056, 1061, 3, 158, 79, 0, 1057, 1058, 5, 119, 0, 0, 1058, 1060, 3, 158, 79, 0, 1059, 1057, 1, 0, 0, 0, 1060, 1063, 1, 0, 0, 0, 1061, 1059, 1, 0, 0, 0, 1061, 1062, 1, 0, 0, 0, 1062, 1065, 1, 0, 0, 0, 1063, 1061, 1, 0, 0, 0, 1064, 1066, 5, 119, 0, 0, 1065, 1064, 1, 0, 0, 0, 1065, 1066, 1, 0, 0, 0, 1066, 1067, 1, 0, 0, 0, 1067, 1068, 5, 152, 0, 0, 1068, 1083, 1, 0, 0, 0, 1069, 1074, 3, 158, 79, 0, 1070, 1071, 5, 119, 0, 0, 1071, 1073, 3, 158, 79, 0, 1072, 1070, 1, 0, 0, 0, 1073, 1076, 1, 0, 0, 0, 1074, 1072, 1, 0, 0, 0, 1074, 1075, 1, 0, 0, 0, 1075, 1078, 1, 0, 0, 0, 1076, 1074, 1, 0, 0, 0, 1077, 1079, 5, 119, 0, 0, 1078, 1077, 1, 0, 0, 0, 1078, 1079, 1, 0, 0, 0, 1079, 1083, 1, 0, 0, 0, 1080, 1081, 5, 133, 0, 0, 1081, 1083, 5, 152, 0, 0, 1082, 1055, 1, 0, 0, 0, 1082, 1069, 1, 0, 0, 0, 1082, 1080, 1, 0, 0, 0, 1083, 1084, 1, 0, 0, 0, 1084, 1087, 5, 114, 0, 0, 1085, 1088, 3, 118, 59, 0, 1086, 1088, 3, 36, 18, 0, 1087, 1085, 1, 0, 0, 0, 1087, 1086, 1, 0, 0, 0, 1088, 121, 1, 0, 0, 0, 1089, 1090, 5, 135, 0, 0, 1090, 1094, 3, 158, 79, 0, 1091, 1093, 3, 124, 62, 0, 1092, 1091, 1, 0, 0, 0, 1093, 1096, 1, 0, 0, 0, 1094, 1092, 1, 0, 0, 0, 1094, 1095, 1, 0, 0, 0, 1095, 1097, 1, 0, 0, 0, 1096, 1094, 1, 0, 0, 0, 1097, 1098, 5, 154, 0, 0, 1098, 1099, 5, 127, 0, 0, 1099, 1122, 1, 0, 0, 0, 1100, 1101, 5, 135, 0, 0, 1101, 1105, 3, 158, 79, 0, 1102, 1104, 3, 124, 62, 0, 1103, 1102, 1, 0, 0, 0, 1104, 1107, 1, 0, 0, 0, 1105, 1103, 1, 0, 0, 0, 1105, 1106, 1, 0, 0, 0, 1106, 1108, 1, 0, 0, 0, 1107, 1105, 1, 0, 0, 0, 1108, 1114, 5, 127, 0, 0, 1109, 1115, 3, 122, 61, 0, 1110, 1111, 5, 131, 0, 0, 1111, 1112, 3, 118, 59, 0, 1112, 1113, 5, 150, 0, 0, 1113, 1115, 1, 0, 0, 0, 1114, 1109, 1, 0, 0, 0, 1114, 1110, 1, 0, 0, 0, 1114, 1115, 1, 0, 0, 0, 1115, 1116, 1, 0, 0, 0, 1116, 1117, 5, 135, 0, 0, 1117, 1118, 5, 154, 0, 0, 1118, 1119, 3, 158, 79, 0, 1119, 1120, 5, 127, 0, 0, 1120, 1122, 1, 0, 0, 0, 1121, 1089, 1, 0, 0, 0, 1121, 1100, 1, 0, 0, 0, 1122, 123, 1, 0, 0, 0, 1123, 1124, 3, 158, 79, 0, 1124, 1125, 5, 125, 0, 0, 1125, 1126, 3, 164, 82, 0, 1126, 1135, 1, 0, 0, 0, 1127, 1128, 3, 158, 79, 0, 1128, 1129, 5, 125, 0, 0, 1129, 1130, 5, 131, 0, 0, 1130, 1131, 3, 118, 59, 0, 1131, 1132, 5, 150, 0, 0, 1132, 1135, 1, 0, 0, 0, 1133, 1135, 3, 158, 79, 0, 1134, 1123, 1, 0, 0, 0, 1134, 1127, 1, 0, 0, 0, 1134, 1133, 1, 0, 0, 0, 1135, 125, 1, 0, 0, 0, 1136, 1141, 3, 128, 64, 0, 1137, 1138, 5, 119, 0, 0, 1138, 1140, 3, 128, 64, 0, 1139, 1137, 1, 0, 0, 0, 1140, 1143, 1, 0, 0, 0, 1141, 1139, 1, 0, 0, 0, 1141, 1142, 1, 0, 0, 0, 1142, 1145, 1, 0, 0, 0, 1143, 1141, 1, 0, 0, 0, 1144, 1146, 5, 119, 0, 0, 1145, 1144, 1, 0, 0, 0, 1145, 1146, 1, 0, 0, 0, 1146, 127, 1, 0, 0, 0, 1147, 1148, 3, 158, 79, 0, 1148, 1149, 5, 6, 0, 0, 1149, 1150, 5, 133, 0, 0, 1150, 1151, 3, 48, 24, 0, 1151, 1152, 5, 152, 0, 0, 1152, 1158, 1, 0, 0, 0, 1153, 1154, 3, 118, 59, 0, 1154, 1155, 5, 6, 0, 0, 1155, 1156, 3, 158, 79, 0, 1156, 1158, 1, 0, 0, 0, 1157, 1147, 1, 0, 0, 0, 1157, 1153, 1, 0, 0, 0, 1158, 129, 1, 0, 0, 0, 1159, 1167, 3, 162, 81, 0, 1160, 1161, 3, 138, 69, 0, 1161, 1162, 5, 123, 0, 0, 1162, 1164, 1, 0, 0, 0, 1163, 1160, 1, 0, 0, 0, 1163, 1164, 1, 0, 0, 0, 1164, 1165, 1, 0, 0, 0, 1165, 1167, 3, 132, 66, 0, 1166, 1159, 1, 0, 0, 0, 1166, 1163, 1, 0, 0, 0, 1167, 131, 1, 0, 0, 0, 1168, 1173, 3, 158, 79, 0, 1169, 1170, 5, 123, 0, 0, 1170, 1172, 3, 158, 79, 0, 1171, 1169, 1, 0, 0, 0, 1172, 1175, 1, 0, 0, 0, 1173, 1171, 1, 0, 0, 0, 1173, 1174, 1, 0, 0, 0, 1174, 133, 1, 0, 0, 0, 1175, 1173, 1, 0, 0, 0, 1176, 1177, 6, 67, -1, 0, 1177, 1186, 3, 138, 69, 0, 1178, 1186, 3, 136, 68, 0, 1179, 1180, 5, 133, 0, 0, 1180, 1181, 3, 48, 24, 0, 1181, 1182, 5, 152, 0, 0, 1182, 1186, 1, 0, 0, 0, 1183, 1186, 3, 122, 61, 0, 1184, 1186, 3, 162, 81, 0, 1185, 1176, 1, 0, 0, 0, 1185, 1178, 1, 0, 0, 0, 1185, 1179, 1, 0, 0, 0, 1185, 1183, 1, 0, 0, 0, 1185, 1184, 1, 0, 0, 0, 1186, 1195, 1, 0, 0, 0, 1187, 1191, 10, 3, 0, 0, 1188, 1192, 3, 156, 78, 0, 1189, 1190, 5, 6, 0, 0, 1190, 1192, 3, 158, 79, 0, 1191, 1188, 1, 0, 0, 0, 1191, 1189, 1, 0, 0, 0, 1192, 1194, 1, 0, 0, 0, 1193, 1187, 1, 0, 0, 0, 1194, 1197, 1, 0, 0, 0, 1195, 1193, 1, 0, 0, 0, 1195, 1196, 1, 0, 0, 0, 1196, 135, 1, 0, 0, 0, 1197, 1195, 1, 0, 0, 0, 1198, 1199, 3, 158, 79, 0, 1199, 1201, 5, 133, 0, 0, 1200, 1202, 3, 140, 70, 0, 1201, 1200, 1, 0, 0, 0, 1201, 1202, 1, 0, 0, 0, 1202, 1203, 1, 0, 0, 0, 1203, 1204, 5, 152, 0, 0, 1204, 137, 1, 0, 0, 0, 1205, 1206, 3, 142, 71, 0, 1206, 1207, 5, 123, 0, 0, 1207, 1209, 1, 0, 0, 0, 1208, 1205, 1, 0, 0, 0, 1208, 1209, 1, 0, 0, 0, 1209, 1210, 1, 0, 0, 0, 1210, 1211, 3, 158, 79, 0, 1211, 139, 1, 0, 0, 0, 1212, 1217, 3, 118, 59, 0, 1213, 1214, 5, 119, 0, 0, 1214, 1216, 3, 118, 59, 0, 1215, 1213, 1, 0, 0, 0, 1216, 1219, 1, 0, 0, 0, 1217, 1215, 1, 0, 0, 0, 1217, 1218, 1, 0, 0, 0, 1218, 1221, 1, 0, 0, 0, 1219, 1217, 1, 0, 0, 0, 1220, 1222, 5, 119, 0, 0, 1221, 1220, 1, 0, 0, 0, 1221, 1222, 1, 0, 0, 0, 1222, 141, 1, 0, 0, 0, 1223, 1224, 3, 158, 79, 0, 1224, 143, 1, 0, 0, 0, 1225, 1234, 5, 109, 0, 0, 1226, 1227, 5, 123, 0, 0, 1227, 1234, 7, 12, 0, 0, 1228, 1229, 5, 111, 0, 0, 1229, 1231, 5, 123, 0, 0, 1230, 1232, 7, 12, 0, 0, 1231, 1230, 1, 0, 0, 0, 1231, 1232, 1, 0, 0, 0, 1232, 1234, 1, 0, 0, 0, 1233, 1225, 1, 0, 0, 0, 1233, 1226, 1, 0, 0, 0, 1233, 1228, 1, 0, 0, 0, 1234, 145, 1, 0, 0, 0, 1235, 1237, 7, 13, 0, 0, 1236, 1235, 1, 0, 0, 0, 1236, 1237, 1, 0, 0, 0, 1237, 1244, 1, 0, 0, 0, 1238, 1245, 3, 144, 72, 0, 1239, 1245, 5, 110, 0, 0, 1240, 1245, 5, 111, 0, 0, 1241, 1245, 5, 112, 0, 0, 1242, 1245, 5, 45, 0, 0, 1243, 1245, 5, 60, 0, 0, 1244, 1238, 1, 0, 0, 0, 1244, 1239, 1, 0, 0, 0, 1244, 1240, 1, 0, 0, 0, 1244, 1241, 1, 0, 0, 0, 1244, 1242, 1, 0, 0, 0, 1244, 1243, 1, 0, 0, 0, 1245, 147, 1, 0, 0, 0, 1246, 1250, 3, 146, 73, 0, 1247, 1250, 5, 113, 0, 0, 1248, 1250, 5, 62, 0, 0, 1249, 1246, 1, 0, 0, 0, 1249, 1247, 1, 0, 0, 0, 1249, 1248, 1, 0, 0, 0, 1250, 149, 1, 0, 0, 0, 1251, 1252, 7, 14, 0, 0, 1252, 151, 1, 0, 0, 0, 1253, 1254, 7, 15, 0, 0, 1254, 153, 1, 0, 0, 0, 1255, 1256, 7, 16, 0, 0, 1256, 155, 1, 0, 0, 0, 1257, 1260, 5, 108, 0, 0, 1258, 1260, 3, 154, 77, 0, 1259, 1257, 1, 0, 0, 0, 1259, 1258, 1, 0, 0, 0, 1260, 157, 1, 0, 0, 0, 1261, 1265, 5, 108, 0, 0, 1262, 1265, 3, 150, 75, 0, 1263, 1265, 3, 152, 76, 0, 1264, 1261, 1, 0, 0, 0, 1264, 1262, 1, 0, 0, 0, 1264, 1263, 1, 0, 0, 0, 1265, 159, 1, 0, 0, 0, 1266, 1267, 3, 164, 82, 0, 1267, 1268, 5, 125, 0, 0, 1268, 1269, 3, 146, 73, 0, 1269, 161, 1, 0, 0, 0, 1270, 1271, 5, 131, 0, 0, 1271, 1272, 3, 118, 59, 0, 1272, 1273, 5, 150, 0, 0, 1273, 163, 1, 0, 0, 0, 1274, 1277, 5, 113, 0, 0, 1275, 1277, 3, 166, 83, 0, 1276, 1274, 1, 0, 0, 0, 1276, 1275, 1, 0, 0, 0, 1277, 165, 1, 0, 0, 0, 1278, 1282, 5, 145, 0, 0, 1279, 1281, 3, 168, 84, 0, 1280, 1279, 1, 0, 0, 0, 1281, 1284, 1, 0, 0, 0, 1282, 1280, 1, 0, 0, 0, 1282, 1283, 1, 0, 0, 0, 1283, 1285, 1, 0, 0, 0, 1284, 1282, 1, 0, 0, 0, 1285, 1286, 5, 147, 0, 0, 1286, 167, 1, 0, 0, 0, 1287, 1288, 5, 160, 0, 0, 1288, 1289, 3, 118, 59, 0, 1289, 1290, 5, 150, 0, 0, 1290, 1293, 1, 0, 0, 0, 1291, 1293, 5, 159, 0, 0, 1292, 1287, 1, 0, 0, 0, 1292, 1291, 1, 0, 0, 0, 1293, 169, 1, 0, 0, 0, 1294, 1298, 5, 146, 0, 0, 1295, 1297, 3, 172, 86, 0, 1296, 1295, 1, 0, 0, 0, 1297, 1300, 1, 0, 0, 0, 1298, 1296, 1, 0, 0, 0, 1298, 1299, 1, 0, 0, 0, 1299, 1301, 1, 0, 0, 0, 1300, 1298, 1, 0, 0, 0, 1301, 1302, 5, 0, 0, 1, 1302, 171, 1, 0, 0, 0, 1303, 1304, 5, 162, 0, 0, 1304, 1305, 3, 118, 59, 0, 1305, 1306, 5, 150, 0, 0, 1306, 1309, 1, 0, 0, 0, 1307, 1309, 5, 161, 0, 0, 1308, 1303, 1, 0, 0, 0, 1308, 1307, 1, 0, 0, 0, 1309, 173, 1, 0, 0, 0, 168, 177, 184, 193, 200, 204, 218, 222, 225, 229, 232, 239, 243, 252, 257, 266, 274, 281, 285, 291, 296, 304, 311, 317, 329, 337, 351, 355, 360, 370, 376, 384, 388, 392, 395, 399, 402, 405, 408, 411, 415, 419, 422, 425, 428, 432, 435, 444, 450, 471, 488, 505, 511, 517, 528, 530, 541, 544, 550, 558, 564, 566, 570, 575, 578, 581, 585, 589, 592, 594, 597, 601, 605, 608, 610, 612, 617, 628, 634, 641, 646, 650, 654, 660, 662, 669, 677, 680, 683, 702, 716, 732, 736, 747, 751, 762, 766, 773, 777, 784, 788, 793, 802, 806, 830, 847, 853, 856, 859, 869, 875, 878, 881, 889, 892, 896, 899, 913, 930, 935, 940, 946, 953, 965, 969, 972, 981, 995, 1011, 1040, 1048, 1050, 1052, 1061, 1065, 1074, 1078, 1082, 1087, 1094, 1105, 1114, 1121, 1134, 1141, 1145, 1157, 1163, 1166, 1173, 1185, 1191, 1195, 1201, 1208, 1217, 1221, 1231, 1233, 1236, 1244, 1249, 1259, 1264, 1276, 1282, 1292, 1298, 1308] \ No newline at end of file diff --git a/posthog/hogql/grammar/HogQLParser.py b/posthog/hogql/grammar/HogQLParser.py index ab0499e653ddb..70f7e139b7999 100644 --- a/posthog/hogql/grammar/HogQLParser.py +++ b/posthog/hogql/grammar/HogQLParser.py @@ -10,7 +10,7 @@ def serializedATN(): return [ - 4,1,160,1303,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, + 4,1,162,1311,2,0,7,0,2,1,7,1,2,2,7,2,2,3,7,3,2,4,7,4,2,5,7,5,2,6, 7,6,2,7,7,7,2,8,7,8,2,9,7,9,2,10,7,10,2,11,7,11,2,12,7,12,2,13,7, 13,2,14,7,14,2,15,7,15,2,16,7,16,2,17,7,17,2,18,7,18,2,19,7,19,2, 20,7,20,2,21,7,21,2,22,7,22,2,23,7,23,2,24,7,24,2,25,7,25,2,26,7, @@ -23,519 +23,522 @@ def serializedATN(): 65,2,66,7,66,2,67,7,67,2,68,7,68,2,69,7,69,2,70,7,70,2,71,7,71,2, 72,7,72,2,73,7,73,2,74,7,74,2,75,7,75,2,76,7,76,2,77,7,77,2,78,7, 78,2,79,7,79,2,80,7,80,2,81,7,81,2,82,7,82,2,83,7,83,2,84,7,84,2, - 85,7,85,1,0,5,0,174,8,0,10,0,12,0,177,9,0,1,0,1,0,1,1,1,1,3,1,183, - 8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,192,8,3,1,4,1,4,1,4,5,4,197, - 8,4,10,4,12,4,200,9,4,1,4,3,4,203,8,4,1,5,1,5,1,5,1,5,1,5,1,5,1, - 5,1,5,1,5,1,5,1,5,1,5,3,5,217,8,5,1,6,1,6,3,6,221,8,6,1,6,3,6,224, - 8,6,1,7,1,7,3,7,228,8,7,1,7,3,7,231,8,7,1,8,1,8,1,8,1,8,1,8,3,8, - 238,8,8,1,8,1,8,3,8,242,8,8,1,8,1,8,1,9,1,9,1,9,5,9,249,8,9,10,9, - 12,9,252,9,9,1,9,1,9,3,9,256,8,9,1,10,1,10,1,10,1,10,1,10,1,10,1, - 10,3,10,265,8,10,1,11,1,11,1,11,1,11,1,11,1,11,3,11,273,8,11,1,12, - 1,12,1,12,1,12,1,12,3,12,280,8,12,1,12,1,12,3,12,284,8,12,1,12,1, - 12,1,12,1,12,3,12,290,8,12,1,12,1,12,1,12,3,12,295,8,12,1,13,1,13, - 1,13,1,13,1,13,1,13,3,13,303,8,13,1,13,1,13,1,13,1,13,1,13,3,13, - 310,8,13,1,14,1,14,1,14,1,14,3,14,316,8,14,1,14,1,14,1,14,1,15,1, - 15,1,15,1,15,1,15,1,16,1,16,3,16,328,8,16,1,17,1,17,1,18,1,18,5, - 18,334,8,18,10,18,12,18,337,9,18,1,18,1,18,1,19,1,19,1,19,1,19,1, - 20,1,20,1,20,5,20,348,8,20,10,20,12,20,351,9,20,1,20,3,20,354,8, - 20,1,21,1,21,1,21,3,21,359,8,21,1,21,1,21,1,22,1,22,1,22,1,22,5, - 22,367,8,22,10,22,12,22,370,9,22,1,23,1,23,1,23,1,23,1,23,1,23,3, - 23,378,8,23,1,24,3,24,381,8,24,1,24,1,24,3,24,385,8,24,1,24,3,24, - 388,8,24,1,24,1,24,3,24,392,8,24,1,24,3,24,395,8,24,1,24,3,24,398, - 8,24,1,24,3,24,401,8,24,1,24,3,24,404,8,24,1,24,1,24,3,24,408,8, - 24,1,24,1,24,3,24,412,8,24,1,24,3,24,415,8,24,1,24,3,24,418,8,24, - 1,24,3,24,421,8,24,1,24,1,24,3,24,425,8,24,1,24,3,24,428,8,24,1, - 25,1,25,1,25,1,26,1,26,1,26,1,26,3,26,437,8,26,1,27,1,27,1,27,1, - 28,3,28,443,8,28,1,28,1,28,1,28,1,28,1,29,1,29,1,29,1,29,1,29,1, - 29,1,29,1,29,1,29,1,29,1,29,1,29,1,29,5,29,462,8,29,10,29,12,29, - 465,9,29,1,30,1,30,1,30,1,31,1,31,1,31,1,32,1,32,1,32,1,32,1,32, - 1,32,1,32,1,32,3,32,481,8,32,1,33,1,33,1,33,1,34,1,34,1,34,1,34, - 1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,3,36,498,8,36,1,36,1,36, - 1,36,1,36,3,36,504,8,36,1,36,1,36,1,36,1,36,3,36,510,8,36,1,36,1, - 36,1,36,1,36,1,36,1,36,1,36,1,36,1,36,3,36,521,8,36,3,36,523,8,36, - 1,37,1,37,1,37,1,38,1,38,1,38,1,39,1,39,1,39,3,39,534,8,39,1,39, - 3,39,537,8,39,1,39,1,39,1,39,1,39,3,39,543,8,39,1,39,1,39,1,39,1, - 39,1,39,1,39,3,39,551,8,39,1,39,1,39,1,39,1,39,5,39,557,8,39,10, - 39,12,39,560,9,39,1,40,3,40,563,8,40,1,40,1,40,1,40,3,40,568,8,40, - 1,40,3,40,571,8,40,1,40,3,40,574,8,40,1,40,1,40,3,40,578,8,40,1, - 40,1,40,3,40,582,8,40,1,40,3,40,585,8,40,3,40,587,8,40,1,40,3,40, - 590,8,40,1,40,1,40,3,40,594,8,40,1,40,1,40,3,40,598,8,40,1,40,3, - 40,601,8,40,3,40,603,8,40,3,40,605,8,40,1,41,1,41,1,41,3,41,610, - 8,41,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,1,42,3,42,621,8,42, - 1,43,1,43,1,43,1,43,3,43,627,8,43,1,44,1,44,1,44,5,44,632,8,44,10, - 44,12,44,635,9,44,1,45,1,45,3,45,639,8,45,1,45,1,45,3,45,643,8,45, - 1,45,1,45,3,45,647,8,45,1,46,1,46,1,46,1,46,3,46,653,8,46,3,46,655, - 8,46,1,47,1,47,1,47,5,47,660,8,47,10,47,12,47,663,9,47,1,48,1,48, - 1,48,1,48,1,49,3,49,670,8,49,1,49,3,49,673,8,49,1,49,3,49,676,8, - 49,1,50,1,50,1,50,1,50,1,51,1,51,1,51,1,51,1,52,1,52,1,52,1,53,1, - 53,1,53,1,53,1,53,1,53,3,53,695,8,53,1,54,1,54,1,54,1,54,1,54,1, - 54,1,54,1,54,1,54,1,54,1,54,1,54,3,54,709,8,54,1,55,1,55,1,55,1, - 56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56,5,56,723,8,56,10,56,12, - 56,726,9,56,1,56,3,56,729,8,56,1,56,1,56,1,56,1,56,1,56,1,56,1,56, - 5,56,738,8,56,10,56,12,56,741,9,56,1,56,3,56,744,8,56,1,56,1,56, - 1,56,1,56,1,56,1,56,1,56,5,56,753,8,56,10,56,12,56,756,9,56,1,56, - 3,56,759,8,56,1,56,1,56,1,56,1,56,1,56,3,56,766,8,56,1,56,1,56,3, - 56,770,8,56,1,57,1,57,1,57,5,57,775,8,57,10,57,12,57,778,9,57,1, - 57,3,57,781,8,57,1,58,1,58,1,58,3,58,786,8,58,1,58,1,58,1,58,1,58, - 1,58,4,58,793,8,58,11,58,12,58,794,1,58,1,58,3,58,799,8,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,823,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 3,58,840,8,58,1,58,1,58,1,58,1,58,3,58,846,8,58,1,58,3,58,849,8, - 58,1,58,3,58,852,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3, - 58,862,8,58,1,58,1,58,1,58,1,58,3,58,868,8,58,1,58,3,58,871,8,58, - 1,58,3,58,874,8,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,882,8,58,1, - 58,3,58,885,8,58,1,58,1,58,3,58,889,8,58,1,58,3,58,892,8,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,906, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,3,58,923,8,58,1,58,1,58,1,58,3,58,928,8,58,1,58,1, - 58,1,58,3,58,933,8,58,1,58,1,58,1,58,1,58,3,58,939,8,58,1,58,1,58, - 1,58,1,58,1,58,3,58,946,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,3,58,958,8,58,1,58,1,58,3,58,962,8,58,1,58,3,58,965, - 8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,974,8,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,3,58,988,8,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,3,58,1004,8,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58,1,58, - 1,58,1,58,1,58,1,58,1,58,3,58,1033,8,58,1,58,1,58,1,58,1,58,1,58, - 1,58,3,58,1041,8,58,5,58,1043,8,58,10,58,12,58,1046,9,58,1,59,1, - 59,1,59,1,59,5,59,1052,8,59,10,59,12,59,1055,9,59,1,59,3,59,1058, - 8,59,1,59,1,59,1,59,1,59,1,59,5,59,1065,8,59,10,59,12,59,1068,9, - 59,1,59,3,59,1071,8,59,1,59,1,59,3,59,1075,8,59,1,59,1,59,1,59,3, - 59,1080,8,59,1,60,1,60,1,60,5,60,1085,8,60,10,60,12,60,1088,9,60, - 1,60,1,60,1,60,1,60,1,60,1,60,5,60,1096,8,60,10,60,12,60,1099,9, - 60,1,60,1,60,1,60,1,60,1,60,1,60,3,60,1107,8,60,1,60,1,60,1,60,1, - 60,1,60,3,60,1114,8,60,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1,61,1, - 61,1,61,1,61,3,61,1127,8,61,1,62,1,62,1,62,5,62,1132,8,62,10,62, - 12,62,1135,9,62,1,62,3,62,1138,8,62,1,63,1,63,1,63,1,63,1,63,1,63, - 1,63,1,63,1,63,1,63,3,63,1150,8,63,1,64,1,64,1,64,1,64,3,64,1156, - 8,64,1,64,3,64,1159,8,64,1,65,1,65,1,65,5,65,1164,8,65,10,65,12, - 65,1167,9,65,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,1,66,3,66,1178, - 8,66,1,66,1,66,1,66,1,66,3,66,1184,8,66,5,66,1186,8,66,10,66,12, - 66,1189,9,66,1,67,1,67,1,67,3,67,1194,8,67,1,67,1,67,1,68,1,68,1, - 68,3,68,1201,8,68,1,68,1,68,1,69,1,69,1,69,5,69,1208,8,69,10,69, - 12,69,1211,9,69,1,69,3,69,1214,8,69,1,70,1,70,1,71,1,71,1,71,1,71, - 1,71,1,71,3,71,1224,8,71,3,71,1226,8,71,1,72,3,72,1229,8,72,1,72, - 1,72,1,72,1,72,1,72,1,72,3,72,1237,8,72,1,73,1,73,1,73,3,73,1242, - 8,73,1,74,1,74,1,75,1,75,1,76,1,76,1,77,1,77,3,77,1252,8,77,1,78, - 1,78,1,78,3,78,1257,8,78,1,79,1,79,1,79,1,79,1,80,1,80,1,80,1,80, - 1,81,1,81,3,81,1269,8,81,1,82,1,82,5,82,1273,8,82,10,82,12,82,1276, - 9,82,1,82,1,82,1,83,1,83,1,83,1,83,1,83,3,83,1285,8,83,1,84,1,84, - 5,84,1289,8,84,10,84,12,84,1292,9,84,1,84,1,84,1,85,1,85,1,85,1, - 85,1,85,3,85,1301,8,85,1,85,0,3,78,116,132,86,0,2,4,6,8,10,12,14, - 16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58, - 60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100, - 102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132, - 134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164, - 166,168,170,0,17,2,0,31,31,36,36,2,0,18,18,75,75,2,0,45,45,52,52, - 3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,81,81,2,0,52,52,74,74,2,0,1,1,4, - 4,2,0,7,7,22,23,2,0,30,30,50,50,2,0,72,72,77,77,3,0,10,10,51,51, - 91,91,2,0,42,42,54,54,1,0,108,109,2,0,119,119,140,140,7,0,21,21, - 39,39,56,57,71,71,79,79,98,98,104,104,17,0,1,13,15,20,22,28,30,30, - 32,35,37,38,40,43,45,52,54,55,59,59,61,70,72,78,80,84,86,93,95,97, - 99,100,102,103,4,0,20,20,30,30,40,40,49,49,1475,0,175,1,0,0,0,2, - 182,1,0,0,0,4,184,1,0,0,0,6,186,1,0,0,0,8,193,1,0,0,0,10,216,1,0, - 0,0,12,218,1,0,0,0,14,225,1,0,0,0,16,232,1,0,0,0,18,245,1,0,0,0, - 20,257,1,0,0,0,22,266,1,0,0,0,24,274,1,0,0,0,26,296,1,0,0,0,28,311, - 1,0,0,0,30,320,1,0,0,0,32,325,1,0,0,0,34,329,1,0,0,0,36,331,1,0, - 0,0,38,340,1,0,0,0,40,344,1,0,0,0,42,358,1,0,0,0,44,362,1,0,0,0, - 46,377,1,0,0,0,48,380,1,0,0,0,50,429,1,0,0,0,52,432,1,0,0,0,54,438, - 1,0,0,0,56,442,1,0,0,0,58,448,1,0,0,0,60,466,1,0,0,0,62,469,1,0, - 0,0,64,472,1,0,0,0,66,482,1,0,0,0,68,485,1,0,0,0,70,489,1,0,0,0, - 72,522,1,0,0,0,74,524,1,0,0,0,76,527,1,0,0,0,78,542,1,0,0,0,80,604, - 1,0,0,0,82,609,1,0,0,0,84,620,1,0,0,0,86,622,1,0,0,0,88,628,1,0, - 0,0,90,636,1,0,0,0,92,654,1,0,0,0,94,656,1,0,0,0,96,664,1,0,0,0, - 98,669,1,0,0,0,100,677,1,0,0,0,102,681,1,0,0,0,104,685,1,0,0,0,106, - 694,1,0,0,0,108,708,1,0,0,0,110,710,1,0,0,0,112,769,1,0,0,0,114, - 771,1,0,0,0,116,932,1,0,0,0,118,1074,1,0,0,0,120,1113,1,0,0,0,122, - 1126,1,0,0,0,124,1128,1,0,0,0,126,1149,1,0,0,0,128,1158,1,0,0,0, - 130,1160,1,0,0,0,132,1177,1,0,0,0,134,1190,1,0,0,0,136,1200,1,0, - 0,0,138,1204,1,0,0,0,140,1215,1,0,0,0,142,1225,1,0,0,0,144,1228, - 1,0,0,0,146,1241,1,0,0,0,148,1243,1,0,0,0,150,1245,1,0,0,0,152,1247, - 1,0,0,0,154,1251,1,0,0,0,156,1256,1,0,0,0,158,1258,1,0,0,0,160,1262, - 1,0,0,0,162,1268,1,0,0,0,164,1270,1,0,0,0,166,1284,1,0,0,0,168,1286, - 1,0,0,0,170,1300,1,0,0,0,172,174,3,2,1,0,173,172,1,0,0,0,174,177, - 1,0,0,0,175,173,1,0,0,0,175,176,1,0,0,0,176,178,1,0,0,0,177,175, - 1,0,0,0,178,179,5,0,0,1,179,1,1,0,0,0,180,183,3,6,3,0,181,183,3, - 10,5,0,182,180,1,0,0,0,182,181,1,0,0,0,183,3,1,0,0,0,184,185,3,116, - 58,0,185,5,1,0,0,0,186,187,5,53,0,0,187,191,3,156,78,0,188,189,5, - 116,0,0,189,190,5,123,0,0,190,192,3,4,2,0,191,188,1,0,0,0,191,192, - 1,0,0,0,192,7,1,0,0,0,193,198,3,156,78,0,194,195,5,117,0,0,195,197, - 3,156,78,0,196,194,1,0,0,0,197,200,1,0,0,0,198,196,1,0,0,0,198,199, - 1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,201,203,5,117,0,0,202,201, - 1,0,0,0,202,203,1,0,0,0,203,9,1,0,0,0,204,217,3,12,6,0,205,217,3, - 14,7,0,206,217,3,18,9,0,207,217,3,20,10,0,208,217,3,22,11,0,209, - 217,3,26,13,0,210,217,3,24,12,0,211,217,3,28,14,0,212,217,3,30,15, - 0,213,217,3,36,18,0,214,217,3,32,16,0,215,217,3,34,17,0,216,204, - 1,0,0,0,216,205,1,0,0,0,216,206,1,0,0,0,216,207,1,0,0,0,216,208, - 1,0,0,0,216,209,1,0,0,0,216,210,1,0,0,0,216,211,1,0,0,0,216,212, - 1,0,0,0,216,213,1,0,0,0,216,214,1,0,0,0,216,215,1,0,0,0,217,11,1, - 0,0,0,218,220,5,73,0,0,219,221,3,4,2,0,220,219,1,0,0,0,220,221,1, - 0,0,0,221,223,1,0,0,0,222,224,5,151,0,0,223,222,1,0,0,0,223,224, - 1,0,0,0,224,13,1,0,0,0,225,227,5,85,0,0,226,228,3,4,2,0,227,226, - 1,0,0,0,227,228,1,0,0,0,228,230,1,0,0,0,229,231,5,151,0,0,230,229, - 1,0,0,0,230,231,1,0,0,0,231,15,1,0,0,0,232,241,5,14,0,0,233,234, - 5,131,0,0,234,237,3,156,78,0,235,236,5,116,0,0,236,238,3,156,78, - 0,237,235,1,0,0,0,237,238,1,0,0,0,238,239,1,0,0,0,239,240,5,150, - 0,0,240,242,1,0,0,0,241,233,1,0,0,0,241,242,1,0,0,0,242,243,1,0, - 0,0,243,244,3,36,18,0,244,17,1,0,0,0,245,246,5,94,0,0,246,250,3, - 36,18,0,247,249,3,16,8,0,248,247,1,0,0,0,249,252,1,0,0,0,250,248, - 1,0,0,0,250,251,1,0,0,0,251,255,1,0,0,0,252,250,1,0,0,0,253,254, - 5,29,0,0,254,256,3,36,18,0,255,253,1,0,0,0,255,256,1,0,0,0,256,19, - 1,0,0,0,257,258,5,41,0,0,258,259,5,131,0,0,259,260,3,4,2,0,260,261, - 5,150,0,0,261,264,3,10,5,0,262,263,5,25,0,0,263,265,3,10,5,0,264, - 262,1,0,0,0,264,265,1,0,0,0,265,21,1,0,0,0,266,267,5,101,0,0,267, - 268,5,131,0,0,268,269,3,4,2,0,269,270,5,150,0,0,270,272,3,10,5,0, - 271,273,5,151,0,0,272,271,1,0,0,0,272,273,1,0,0,0,273,23,1,0,0,0, - 274,275,5,33,0,0,275,279,5,131,0,0,276,280,3,6,3,0,277,280,3,30, - 15,0,278,280,3,4,2,0,279,276,1,0,0,0,279,277,1,0,0,0,279,278,1,0, - 0,0,279,280,1,0,0,0,280,281,1,0,0,0,281,283,5,151,0,0,282,284,3, - 4,2,0,283,282,1,0,0,0,283,284,1,0,0,0,284,285,1,0,0,0,285,289,5, - 151,0,0,286,290,3,6,3,0,287,290,3,30,15,0,288,290,3,4,2,0,289,286, - 1,0,0,0,289,287,1,0,0,0,289,288,1,0,0,0,289,290,1,0,0,0,290,291, - 1,0,0,0,291,292,5,150,0,0,292,294,3,10,5,0,293,295,5,151,0,0,294, - 293,1,0,0,0,294,295,1,0,0,0,295,25,1,0,0,0,296,297,5,33,0,0,297, - 298,5,131,0,0,298,299,5,53,0,0,299,302,3,156,78,0,300,301,5,117, - 0,0,301,303,3,156,78,0,302,300,1,0,0,0,302,303,1,0,0,0,303,304,1, - 0,0,0,304,305,5,43,0,0,305,306,3,4,2,0,306,307,5,150,0,0,307,309, - 3,10,5,0,308,310,5,151,0,0,309,308,1,0,0,0,309,310,1,0,0,0,310,27, - 1,0,0,0,311,312,7,0,0,0,312,313,3,156,78,0,313,315,5,131,0,0,314, - 316,3,8,4,0,315,314,1,0,0,0,315,316,1,0,0,0,316,317,1,0,0,0,317, - 318,5,150,0,0,318,319,3,36,18,0,319,29,1,0,0,0,320,321,3,4,2,0,321, - 322,5,116,0,0,322,323,5,123,0,0,323,324,3,4,2,0,324,31,1,0,0,0,325, - 327,3,4,2,0,326,328,5,151,0,0,327,326,1,0,0,0,327,328,1,0,0,0,328, - 33,1,0,0,0,329,330,5,151,0,0,330,35,1,0,0,0,331,335,5,129,0,0,332, - 334,3,2,1,0,333,332,1,0,0,0,334,337,1,0,0,0,335,333,1,0,0,0,335, - 336,1,0,0,0,336,338,1,0,0,0,337,335,1,0,0,0,338,339,5,148,0,0,339, - 37,1,0,0,0,340,341,3,4,2,0,341,342,5,116,0,0,342,343,3,4,2,0,343, - 39,1,0,0,0,344,349,3,38,19,0,345,346,5,117,0,0,346,348,3,38,19,0, - 347,345,1,0,0,0,348,351,1,0,0,0,349,347,1,0,0,0,349,350,1,0,0,0, - 350,353,1,0,0,0,351,349,1,0,0,0,352,354,5,117,0,0,353,352,1,0,0, - 0,353,354,1,0,0,0,354,41,1,0,0,0,355,359,3,44,22,0,356,359,3,48, - 24,0,357,359,3,120,60,0,358,355,1,0,0,0,358,356,1,0,0,0,358,357, - 1,0,0,0,359,360,1,0,0,0,360,361,5,0,0,1,361,43,1,0,0,0,362,368,3, - 46,23,0,363,364,5,96,0,0,364,365,5,1,0,0,365,367,3,46,23,0,366,363, - 1,0,0,0,367,370,1,0,0,0,368,366,1,0,0,0,368,369,1,0,0,0,369,45,1, - 0,0,0,370,368,1,0,0,0,371,378,3,48,24,0,372,373,5,131,0,0,373,374, - 3,44,22,0,374,375,5,150,0,0,375,378,1,0,0,0,376,378,3,160,80,0,377, - 371,1,0,0,0,377,372,1,0,0,0,377,376,1,0,0,0,378,47,1,0,0,0,379,381, - 3,50,25,0,380,379,1,0,0,0,380,381,1,0,0,0,381,382,1,0,0,0,382,384, - 5,80,0,0,383,385,5,24,0,0,384,383,1,0,0,0,384,385,1,0,0,0,385,387, - 1,0,0,0,386,388,3,52,26,0,387,386,1,0,0,0,387,388,1,0,0,0,388,389, - 1,0,0,0,389,391,3,114,57,0,390,392,3,54,27,0,391,390,1,0,0,0,391, - 392,1,0,0,0,392,394,1,0,0,0,393,395,3,56,28,0,394,393,1,0,0,0,394, - 395,1,0,0,0,395,397,1,0,0,0,396,398,3,60,30,0,397,396,1,0,0,0,397, - 398,1,0,0,0,398,400,1,0,0,0,399,401,3,62,31,0,400,399,1,0,0,0,400, - 401,1,0,0,0,401,403,1,0,0,0,402,404,3,64,32,0,403,402,1,0,0,0,403, - 404,1,0,0,0,404,407,1,0,0,0,405,406,5,103,0,0,406,408,7,1,0,0,407, - 405,1,0,0,0,407,408,1,0,0,0,408,411,1,0,0,0,409,410,5,103,0,0,410, - 412,5,90,0,0,411,409,1,0,0,0,411,412,1,0,0,0,412,414,1,0,0,0,413, - 415,3,66,33,0,414,413,1,0,0,0,414,415,1,0,0,0,415,417,1,0,0,0,416, - 418,3,58,29,0,417,416,1,0,0,0,417,418,1,0,0,0,418,420,1,0,0,0,419, - 421,3,68,34,0,420,419,1,0,0,0,420,421,1,0,0,0,421,424,1,0,0,0,422, - 425,3,72,36,0,423,425,3,74,37,0,424,422,1,0,0,0,424,423,1,0,0,0, - 424,425,1,0,0,0,425,427,1,0,0,0,426,428,3,76,38,0,427,426,1,0,0, - 0,427,428,1,0,0,0,428,49,1,0,0,0,429,430,5,103,0,0,430,431,3,124, - 62,0,431,51,1,0,0,0,432,433,5,89,0,0,433,436,5,109,0,0,434,435,5, - 103,0,0,435,437,5,86,0,0,436,434,1,0,0,0,436,437,1,0,0,0,437,53, - 1,0,0,0,438,439,5,34,0,0,439,440,3,78,39,0,440,55,1,0,0,0,441,443, - 7,2,0,0,442,441,1,0,0,0,442,443,1,0,0,0,443,444,1,0,0,0,444,445, - 5,5,0,0,445,446,5,48,0,0,446,447,3,114,57,0,447,57,1,0,0,0,448,449, - 5,102,0,0,449,450,3,156,78,0,450,451,5,6,0,0,451,452,5,131,0,0,452, - 453,3,98,49,0,453,463,5,150,0,0,454,455,5,117,0,0,455,456,3,156, - 78,0,456,457,5,6,0,0,457,458,5,131,0,0,458,459,3,98,49,0,459,460, - 5,150,0,0,460,462,1,0,0,0,461,454,1,0,0,0,462,465,1,0,0,0,463,461, - 1,0,0,0,463,464,1,0,0,0,464,59,1,0,0,0,465,463,1,0,0,0,466,467,5, - 70,0,0,467,468,3,116,58,0,468,61,1,0,0,0,469,470,5,100,0,0,470,471, - 3,116,58,0,471,63,1,0,0,0,472,473,5,37,0,0,473,480,5,11,0,0,474, - 475,7,1,0,0,475,476,5,131,0,0,476,477,3,114,57,0,477,478,5,150,0, - 0,478,481,1,0,0,0,479,481,3,114,57,0,480,474,1,0,0,0,480,479,1,0, - 0,0,481,65,1,0,0,0,482,483,5,38,0,0,483,484,3,116,58,0,484,67,1, - 0,0,0,485,486,5,65,0,0,486,487,5,11,0,0,487,488,3,88,44,0,488,69, - 1,0,0,0,489,490,5,65,0,0,490,491,5,11,0,0,491,492,3,114,57,0,492, - 71,1,0,0,0,493,494,5,55,0,0,494,497,3,116,58,0,495,496,5,117,0,0, - 496,498,3,116,58,0,497,495,1,0,0,0,497,498,1,0,0,0,498,503,1,0,0, - 0,499,500,5,103,0,0,500,504,5,86,0,0,501,502,5,11,0,0,502,504,3, - 114,57,0,503,499,1,0,0,0,503,501,1,0,0,0,503,504,1,0,0,0,504,523, - 1,0,0,0,505,506,5,55,0,0,506,509,3,116,58,0,507,508,5,103,0,0,508, - 510,5,86,0,0,509,507,1,0,0,0,509,510,1,0,0,0,510,511,1,0,0,0,511, - 512,5,62,0,0,512,513,3,116,58,0,513,523,1,0,0,0,514,515,5,55,0,0, - 515,516,3,116,58,0,516,517,5,62,0,0,517,520,3,116,58,0,518,519,5, - 11,0,0,519,521,3,114,57,0,520,518,1,0,0,0,520,521,1,0,0,0,521,523, - 1,0,0,0,522,493,1,0,0,0,522,505,1,0,0,0,522,514,1,0,0,0,523,73,1, - 0,0,0,524,525,5,62,0,0,525,526,3,116,58,0,526,75,1,0,0,0,527,528, - 5,82,0,0,528,529,3,94,47,0,529,77,1,0,0,0,530,531,6,39,-1,0,531, - 533,3,132,66,0,532,534,5,28,0,0,533,532,1,0,0,0,533,534,1,0,0,0, - 534,536,1,0,0,0,535,537,3,86,43,0,536,535,1,0,0,0,536,537,1,0,0, - 0,537,543,1,0,0,0,538,539,5,131,0,0,539,540,3,78,39,0,540,541,5, - 150,0,0,541,543,1,0,0,0,542,530,1,0,0,0,542,538,1,0,0,0,543,558, - 1,0,0,0,544,545,10,3,0,0,545,546,3,82,41,0,546,547,3,78,39,4,547, - 557,1,0,0,0,548,550,10,4,0,0,549,551,3,80,40,0,550,549,1,0,0,0,550, - 551,1,0,0,0,551,552,1,0,0,0,552,553,5,48,0,0,553,554,3,78,39,0,554, - 555,3,84,42,0,555,557,1,0,0,0,556,544,1,0,0,0,556,548,1,0,0,0,557, - 560,1,0,0,0,558,556,1,0,0,0,558,559,1,0,0,0,559,79,1,0,0,0,560,558, - 1,0,0,0,561,563,7,3,0,0,562,561,1,0,0,0,562,563,1,0,0,0,563,564, - 1,0,0,0,564,571,5,45,0,0,565,567,5,45,0,0,566,568,7,3,0,0,567,566, - 1,0,0,0,567,568,1,0,0,0,568,571,1,0,0,0,569,571,7,3,0,0,570,562, - 1,0,0,0,570,565,1,0,0,0,570,569,1,0,0,0,571,605,1,0,0,0,572,574, - 7,4,0,0,573,572,1,0,0,0,573,574,1,0,0,0,574,575,1,0,0,0,575,577, - 7,5,0,0,576,578,5,66,0,0,577,576,1,0,0,0,577,578,1,0,0,0,578,587, - 1,0,0,0,579,581,7,5,0,0,580,582,5,66,0,0,581,580,1,0,0,0,581,582, - 1,0,0,0,582,584,1,0,0,0,583,585,7,4,0,0,584,583,1,0,0,0,584,585, - 1,0,0,0,585,587,1,0,0,0,586,573,1,0,0,0,586,579,1,0,0,0,587,605, - 1,0,0,0,588,590,7,6,0,0,589,588,1,0,0,0,589,590,1,0,0,0,590,591, - 1,0,0,0,591,593,5,35,0,0,592,594,5,66,0,0,593,592,1,0,0,0,593,594, - 1,0,0,0,594,603,1,0,0,0,595,597,5,35,0,0,596,598,5,66,0,0,597,596, - 1,0,0,0,597,598,1,0,0,0,598,600,1,0,0,0,599,601,7,6,0,0,600,599, - 1,0,0,0,600,601,1,0,0,0,601,603,1,0,0,0,602,589,1,0,0,0,602,595, - 1,0,0,0,603,605,1,0,0,0,604,570,1,0,0,0,604,586,1,0,0,0,604,602, - 1,0,0,0,605,81,1,0,0,0,606,607,5,17,0,0,607,610,5,48,0,0,608,610, - 5,117,0,0,609,606,1,0,0,0,609,608,1,0,0,0,610,83,1,0,0,0,611,612, - 5,63,0,0,612,621,3,114,57,0,613,614,5,97,0,0,614,615,5,131,0,0,615, - 616,3,114,57,0,616,617,5,150,0,0,617,621,1,0,0,0,618,619,5,97,0, - 0,619,621,3,114,57,0,620,611,1,0,0,0,620,613,1,0,0,0,620,618,1,0, - 0,0,621,85,1,0,0,0,622,623,5,78,0,0,623,626,3,92,46,0,624,625,5, - 62,0,0,625,627,3,92,46,0,626,624,1,0,0,0,626,627,1,0,0,0,627,87, - 1,0,0,0,628,633,3,90,45,0,629,630,5,117,0,0,630,632,3,90,45,0,631, - 629,1,0,0,0,632,635,1,0,0,0,633,631,1,0,0,0,633,634,1,0,0,0,634, - 89,1,0,0,0,635,633,1,0,0,0,636,638,3,116,58,0,637,639,7,7,0,0,638, - 637,1,0,0,0,638,639,1,0,0,0,639,642,1,0,0,0,640,641,5,61,0,0,641, - 643,7,8,0,0,642,640,1,0,0,0,642,643,1,0,0,0,643,646,1,0,0,0,644, - 645,5,16,0,0,645,647,5,111,0,0,646,644,1,0,0,0,646,647,1,0,0,0,647, - 91,1,0,0,0,648,655,3,160,80,0,649,652,3,144,72,0,650,651,5,152,0, - 0,651,653,3,144,72,0,652,650,1,0,0,0,652,653,1,0,0,0,653,655,1,0, - 0,0,654,648,1,0,0,0,654,649,1,0,0,0,655,93,1,0,0,0,656,661,3,96, - 48,0,657,658,5,117,0,0,658,660,3,96,48,0,659,657,1,0,0,0,660,663, - 1,0,0,0,661,659,1,0,0,0,661,662,1,0,0,0,662,95,1,0,0,0,663,661,1, - 0,0,0,664,665,3,156,78,0,665,666,5,123,0,0,666,667,3,146,73,0,667, - 97,1,0,0,0,668,670,3,100,50,0,669,668,1,0,0,0,669,670,1,0,0,0,670, - 672,1,0,0,0,671,673,3,102,51,0,672,671,1,0,0,0,672,673,1,0,0,0,673, - 675,1,0,0,0,674,676,3,104,52,0,675,674,1,0,0,0,675,676,1,0,0,0,676, - 99,1,0,0,0,677,678,5,68,0,0,678,679,5,11,0,0,679,680,3,114,57,0, - 680,101,1,0,0,0,681,682,5,65,0,0,682,683,5,11,0,0,683,684,3,88,44, - 0,684,103,1,0,0,0,685,686,7,9,0,0,686,687,3,106,53,0,687,105,1,0, - 0,0,688,695,3,108,54,0,689,690,5,9,0,0,690,691,3,108,54,0,691,692, - 5,2,0,0,692,693,3,108,54,0,693,695,1,0,0,0,694,688,1,0,0,0,694,689, - 1,0,0,0,695,107,1,0,0,0,696,697,5,19,0,0,697,709,5,76,0,0,698,699, - 5,95,0,0,699,709,5,69,0,0,700,701,5,95,0,0,701,709,5,32,0,0,702, - 703,3,144,72,0,703,704,5,69,0,0,704,709,1,0,0,0,705,706,3,144,72, - 0,706,707,5,32,0,0,707,709,1,0,0,0,708,696,1,0,0,0,708,698,1,0,0, - 0,708,700,1,0,0,0,708,702,1,0,0,0,708,705,1,0,0,0,709,109,1,0,0, - 0,710,711,3,116,58,0,711,712,5,0,0,1,712,111,1,0,0,0,713,770,3,156, - 78,0,714,715,3,156,78,0,715,716,5,131,0,0,716,717,3,156,78,0,717, - 724,3,112,56,0,718,719,5,117,0,0,719,720,3,156,78,0,720,721,3,112, - 56,0,721,723,1,0,0,0,722,718,1,0,0,0,723,726,1,0,0,0,724,722,1,0, - 0,0,724,725,1,0,0,0,725,728,1,0,0,0,726,724,1,0,0,0,727,729,5,117, - 0,0,728,727,1,0,0,0,728,729,1,0,0,0,729,730,1,0,0,0,730,731,5,150, - 0,0,731,770,1,0,0,0,732,733,3,156,78,0,733,734,5,131,0,0,734,739, - 3,158,79,0,735,736,5,117,0,0,736,738,3,158,79,0,737,735,1,0,0,0, - 738,741,1,0,0,0,739,737,1,0,0,0,739,740,1,0,0,0,740,743,1,0,0,0, - 741,739,1,0,0,0,742,744,5,117,0,0,743,742,1,0,0,0,743,744,1,0,0, - 0,744,745,1,0,0,0,745,746,5,150,0,0,746,770,1,0,0,0,747,748,3,156, - 78,0,748,749,5,131,0,0,749,754,3,112,56,0,750,751,5,117,0,0,751, - 753,3,112,56,0,752,750,1,0,0,0,753,756,1,0,0,0,754,752,1,0,0,0,754, - 755,1,0,0,0,755,758,1,0,0,0,756,754,1,0,0,0,757,759,5,117,0,0,758, - 757,1,0,0,0,758,759,1,0,0,0,759,760,1,0,0,0,760,761,5,150,0,0,761, - 770,1,0,0,0,762,763,3,156,78,0,763,765,5,131,0,0,764,766,3,114,57, - 0,765,764,1,0,0,0,765,766,1,0,0,0,766,767,1,0,0,0,767,768,5,150, - 0,0,768,770,1,0,0,0,769,713,1,0,0,0,769,714,1,0,0,0,769,732,1,0, - 0,0,769,747,1,0,0,0,769,762,1,0,0,0,770,113,1,0,0,0,771,776,3,116, - 58,0,772,773,5,117,0,0,773,775,3,116,58,0,774,772,1,0,0,0,775,778, - 1,0,0,0,776,774,1,0,0,0,776,777,1,0,0,0,777,780,1,0,0,0,778,776, - 1,0,0,0,779,781,5,117,0,0,780,779,1,0,0,0,780,781,1,0,0,0,781,115, - 1,0,0,0,782,783,6,58,-1,0,783,785,5,12,0,0,784,786,3,116,58,0,785, - 784,1,0,0,0,785,786,1,0,0,0,786,792,1,0,0,0,787,788,5,99,0,0,788, - 789,3,116,58,0,789,790,5,84,0,0,790,791,3,116,58,0,791,793,1,0,0, - 0,792,787,1,0,0,0,793,794,1,0,0,0,794,792,1,0,0,0,794,795,1,0,0, - 0,795,798,1,0,0,0,796,797,5,25,0,0,797,799,3,116,58,0,798,796,1, - 0,0,0,798,799,1,0,0,0,799,800,1,0,0,0,800,801,5,26,0,0,801,933,1, - 0,0,0,802,803,5,13,0,0,803,804,5,131,0,0,804,805,3,116,58,0,805, - 806,5,6,0,0,806,807,3,112,56,0,807,808,5,150,0,0,808,933,1,0,0,0, - 809,810,5,20,0,0,810,933,5,111,0,0,811,812,5,46,0,0,812,813,3,116, - 58,0,813,814,3,148,74,0,814,933,1,0,0,0,815,816,5,83,0,0,816,817, - 5,131,0,0,817,818,3,116,58,0,818,819,5,34,0,0,819,822,3,116,58,0, - 820,821,5,33,0,0,821,823,3,116,58,0,822,820,1,0,0,0,822,823,1,0, - 0,0,823,824,1,0,0,0,824,825,5,150,0,0,825,933,1,0,0,0,826,827,5, - 87,0,0,827,933,5,111,0,0,828,829,5,92,0,0,829,830,5,131,0,0,830, - 831,7,10,0,0,831,832,3,162,81,0,832,833,5,34,0,0,833,834,3,116,58, - 0,834,835,5,150,0,0,835,933,1,0,0,0,836,837,3,156,78,0,837,839,5, - 131,0,0,838,840,3,114,57,0,839,838,1,0,0,0,839,840,1,0,0,0,840,841, - 1,0,0,0,841,842,5,150,0,0,842,851,1,0,0,0,843,845,5,131,0,0,844, - 846,5,24,0,0,845,844,1,0,0,0,845,846,1,0,0,0,846,848,1,0,0,0,847, - 849,3,114,57,0,848,847,1,0,0,0,848,849,1,0,0,0,849,850,1,0,0,0,850, - 852,5,150,0,0,851,843,1,0,0,0,851,852,1,0,0,0,852,853,1,0,0,0,853, - 854,5,67,0,0,854,855,5,131,0,0,855,856,3,98,49,0,856,857,5,150,0, - 0,857,933,1,0,0,0,858,859,3,156,78,0,859,861,5,131,0,0,860,862,3, - 114,57,0,861,860,1,0,0,0,861,862,1,0,0,0,862,863,1,0,0,0,863,864, - 5,150,0,0,864,873,1,0,0,0,865,867,5,131,0,0,866,868,5,24,0,0,867, - 866,1,0,0,0,867,868,1,0,0,0,868,870,1,0,0,0,869,871,3,114,57,0,870, - 869,1,0,0,0,870,871,1,0,0,0,871,872,1,0,0,0,872,874,5,150,0,0,873, - 865,1,0,0,0,873,874,1,0,0,0,874,875,1,0,0,0,875,876,5,67,0,0,876, - 877,3,156,78,0,877,933,1,0,0,0,878,884,3,156,78,0,879,881,5,131, - 0,0,880,882,3,114,57,0,881,880,1,0,0,0,881,882,1,0,0,0,882,883,1, - 0,0,0,883,885,5,150,0,0,884,879,1,0,0,0,884,885,1,0,0,0,885,886, - 1,0,0,0,886,888,5,131,0,0,887,889,5,24,0,0,888,887,1,0,0,0,888,889, - 1,0,0,0,889,891,1,0,0,0,890,892,3,114,57,0,891,890,1,0,0,0,891,892, - 1,0,0,0,892,893,1,0,0,0,893,894,5,150,0,0,894,933,1,0,0,0,895,933, - 3,120,60,0,896,933,3,164,82,0,897,933,3,146,73,0,898,899,5,119,0, - 0,899,933,3,116,58,20,900,901,5,59,0,0,901,933,3,116,58,14,902,903, - 3,136,68,0,903,904,5,121,0,0,904,906,1,0,0,0,905,902,1,0,0,0,905, - 906,1,0,0,0,906,907,1,0,0,0,907,933,5,113,0,0,908,909,5,131,0,0, - 909,910,3,44,22,0,910,911,5,150,0,0,911,933,1,0,0,0,912,913,5,131, - 0,0,913,914,3,116,58,0,914,915,5,150,0,0,915,933,1,0,0,0,916,917, - 5,131,0,0,917,918,3,114,57,0,918,919,5,150,0,0,919,933,1,0,0,0,920, - 922,5,130,0,0,921,923,3,114,57,0,922,921,1,0,0,0,922,923,1,0,0,0, - 923,924,1,0,0,0,924,933,5,149,0,0,925,927,5,129,0,0,926,928,3,40, - 20,0,927,926,1,0,0,0,927,928,1,0,0,0,928,929,1,0,0,0,929,933,5,148, - 0,0,930,933,3,118,59,0,931,933,3,128,64,0,932,782,1,0,0,0,932,802, - 1,0,0,0,932,809,1,0,0,0,932,811,1,0,0,0,932,815,1,0,0,0,932,826, - 1,0,0,0,932,828,1,0,0,0,932,836,1,0,0,0,932,858,1,0,0,0,932,878, - 1,0,0,0,932,895,1,0,0,0,932,896,1,0,0,0,932,897,1,0,0,0,932,898, - 1,0,0,0,932,900,1,0,0,0,932,905,1,0,0,0,932,908,1,0,0,0,932,912, - 1,0,0,0,932,916,1,0,0,0,932,920,1,0,0,0,932,925,1,0,0,0,932,930, - 1,0,0,0,932,931,1,0,0,0,933,1044,1,0,0,0,934,938,10,19,0,0,935,939, - 5,113,0,0,936,939,5,152,0,0,937,939,5,139,0,0,938,935,1,0,0,0,938, - 936,1,0,0,0,938,937,1,0,0,0,939,940,1,0,0,0,940,1043,3,116,58,20, - 941,945,10,18,0,0,942,946,5,140,0,0,943,946,5,119,0,0,944,946,5, - 118,0,0,945,942,1,0,0,0,945,943,1,0,0,0,945,944,1,0,0,0,946,947, - 1,0,0,0,947,1043,3,116,58,19,948,973,10,17,0,0,949,974,5,122,0,0, - 950,974,5,123,0,0,951,974,5,134,0,0,952,974,5,132,0,0,953,974,5, - 133,0,0,954,974,5,124,0,0,955,974,5,125,0,0,956,958,5,59,0,0,957, - 956,1,0,0,0,957,958,1,0,0,0,958,959,1,0,0,0,959,961,5,43,0,0,960, - 962,5,15,0,0,961,960,1,0,0,0,961,962,1,0,0,0,962,974,1,0,0,0,963, - 965,5,59,0,0,964,963,1,0,0,0,964,965,1,0,0,0,965,966,1,0,0,0,966, - 974,7,11,0,0,967,974,5,146,0,0,968,974,5,147,0,0,969,974,5,136,0, - 0,970,974,5,127,0,0,971,974,5,128,0,0,972,974,5,135,0,0,973,949, - 1,0,0,0,973,950,1,0,0,0,973,951,1,0,0,0,973,952,1,0,0,0,973,953, - 1,0,0,0,973,954,1,0,0,0,973,955,1,0,0,0,973,957,1,0,0,0,973,964, - 1,0,0,0,973,967,1,0,0,0,973,968,1,0,0,0,973,969,1,0,0,0,973,970, - 1,0,0,0,973,971,1,0,0,0,973,972,1,0,0,0,974,975,1,0,0,0,975,1043, - 3,116,58,18,976,977,10,15,0,0,977,978,5,138,0,0,978,1043,3,116,58, - 16,979,980,10,13,0,0,980,981,5,2,0,0,981,1043,3,116,58,14,982,983, - 10,12,0,0,983,984,5,64,0,0,984,1043,3,116,58,13,985,987,10,11,0, - 0,986,988,5,59,0,0,987,986,1,0,0,0,987,988,1,0,0,0,988,989,1,0,0, - 0,989,990,5,9,0,0,990,991,3,116,58,0,991,992,5,2,0,0,992,993,3,116, - 58,12,993,1043,1,0,0,0,994,995,10,10,0,0,995,996,5,141,0,0,996,997, - 3,116,58,0,997,998,5,116,0,0,998,999,3,116,58,10,999,1043,1,0,0, - 0,1000,1001,10,30,0,0,1001,1003,5,131,0,0,1002,1004,3,114,57,0,1003, - 1002,1,0,0,0,1003,1004,1,0,0,0,1004,1005,1,0,0,0,1005,1043,5,150, - 0,0,1006,1007,10,26,0,0,1007,1008,5,130,0,0,1008,1009,3,116,58,0, - 1009,1010,5,149,0,0,1010,1043,1,0,0,0,1011,1012,10,25,0,0,1012,1013, - 5,121,0,0,1013,1043,5,109,0,0,1014,1015,10,24,0,0,1015,1016,5,121, - 0,0,1016,1043,3,156,78,0,1017,1018,10,23,0,0,1018,1019,5,137,0,0, - 1019,1020,5,130,0,0,1020,1021,3,116,58,0,1021,1022,5,149,0,0,1022, - 1043,1,0,0,0,1023,1024,10,22,0,0,1024,1025,5,137,0,0,1025,1043,5, - 109,0,0,1026,1027,10,21,0,0,1027,1028,5,137,0,0,1028,1043,3,156, - 78,0,1029,1030,10,16,0,0,1030,1032,5,47,0,0,1031,1033,5,59,0,0,1032, - 1031,1,0,0,0,1032,1033,1,0,0,0,1033,1034,1,0,0,0,1034,1043,5,60, - 0,0,1035,1040,10,9,0,0,1036,1037,5,6,0,0,1037,1041,3,156,78,0,1038, - 1039,5,6,0,0,1039,1041,5,111,0,0,1040,1036,1,0,0,0,1040,1038,1,0, - 0,0,1041,1043,1,0,0,0,1042,934,1,0,0,0,1042,941,1,0,0,0,1042,948, - 1,0,0,0,1042,976,1,0,0,0,1042,979,1,0,0,0,1042,982,1,0,0,0,1042, - 985,1,0,0,0,1042,994,1,0,0,0,1042,1000,1,0,0,0,1042,1006,1,0,0,0, - 1042,1011,1,0,0,0,1042,1014,1,0,0,0,1042,1017,1,0,0,0,1042,1023, - 1,0,0,0,1042,1026,1,0,0,0,1042,1029,1,0,0,0,1042,1035,1,0,0,0,1043, - 1046,1,0,0,0,1044,1042,1,0,0,0,1044,1045,1,0,0,0,1045,117,1,0,0, - 0,1046,1044,1,0,0,0,1047,1048,5,131,0,0,1048,1053,3,156,78,0,1049, - 1050,5,117,0,0,1050,1052,3,156,78,0,1051,1049,1,0,0,0,1052,1055, - 1,0,0,0,1053,1051,1,0,0,0,1053,1054,1,0,0,0,1054,1057,1,0,0,0,1055, - 1053,1,0,0,0,1056,1058,5,117,0,0,1057,1056,1,0,0,0,1057,1058,1,0, - 0,0,1058,1059,1,0,0,0,1059,1060,5,150,0,0,1060,1075,1,0,0,0,1061, - 1066,3,156,78,0,1062,1063,5,117,0,0,1063,1065,3,156,78,0,1064,1062, - 1,0,0,0,1065,1068,1,0,0,0,1066,1064,1,0,0,0,1066,1067,1,0,0,0,1067, - 1070,1,0,0,0,1068,1066,1,0,0,0,1069,1071,5,117,0,0,1070,1069,1,0, - 0,0,1070,1071,1,0,0,0,1071,1075,1,0,0,0,1072,1073,5,131,0,0,1073, - 1075,5,150,0,0,1074,1047,1,0,0,0,1074,1061,1,0,0,0,1074,1072,1,0, - 0,0,1075,1076,1,0,0,0,1076,1079,5,112,0,0,1077,1080,3,116,58,0,1078, - 1080,3,36,18,0,1079,1077,1,0,0,0,1079,1078,1,0,0,0,1080,119,1,0, - 0,0,1081,1082,5,133,0,0,1082,1086,3,156,78,0,1083,1085,3,122,61, - 0,1084,1083,1,0,0,0,1085,1088,1,0,0,0,1086,1084,1,0,0,0,1086,1087, - 1,0,0,0,1087,1089,1,0,0,0,1088,1086,1,0,0,0,1089,1090,5,152,0,0, - 1090,1091,5,125,0,0,1091,1114,1,0,0,0,1092,1093,5,133,0,0,1093,1097, - 3,156,78,0,1094,1096,3,122,61,0,1095,1094,1,0,0,0,1096,1099,1,0, - 0,0,1097,1095,1,0,0,0,1097,1098,1,0,0,0,1098,1100,1,0,0,0,1099,1097, - 1,0,0,0,1100,1106,5,125,0,0,1101,1107,3,120,60,0,1102,1103,5,129, - 0,0,1103,1104,3,116,58,0,1104,1105,5,148,0,0,1105,1107,1,0,0,0,1106, - 1101,1,0,0,0,1106,1102,1,0,0,0,1106,1107,1,0,0,0,1107,1108,1,0,0, - 0,1108,1109,5,133,0,0,1109,1110,5,152,0,0,1110,1111,3,156,78,0,1111, - 1112,5,125,0,0,1112,1114,1,0,0,0,1113,1081,1,0,0,0,1113,1092,1,0, - 0,0,1114,121,1,0,0,0,1115,1116,3,156,78,0,1116,1117,5,123,0,0,1117, - 1118,3,162,81,0,1118,1127,1,0,0,0,1119,1120,3,156,78,0,1120,1121, - 5,123,0,0,1121,1122,5,129,0,0,1122,1123,3,116,58,0,1123,1124,5,148, - 0,0,1124,1127,1,0,0,0,1125,1127,3,156,78,0,1126,1115,1,0,0,0,1126, - 1119,1,0,0,0,1126,1125,1,0,0,0,1127,123,1,0,0,0,1128,1133,3,126, - 63,0,1129,1130,5,117,0,0,1130,1132,3,126,63,0,1131,1129,1,0,0,0, - 1132,1135,1,0,0,0,1133,1131,1,0,0,0,1133,1134,1,0,0,0,1134,1137, - 1,0,0,0,1135,1133,1,0,0,0,1136,1138,5,117,0,0,1137,1136,1,0,0,0, - 1137,1138,1,0,0,0,1138,125,1,0,0,0,1139,1140,3,156,78,0,1140,1141, - 5,6,0,0,1141,1142,5,131,0,0,1142,1143,3,44,22,0,1143,1144,5,150, - 0,0,1144,1150,1,0,0,0,1145,1146,3,116,58,0,1146,1147,5,6,0,0,1147, - 1148,3,156,78,0,1148,1150,1,0,0,0,1149,1139,1,0,0,0,1149,1145,1, - 0,0,0,1150,127,1,0,0,0,1151,1159,3,160,80,0,1152,1153,3,136,68,0, - 1153,1154,5,121,0,0,1154,1156,1,0,0,0,1155,1152,1,0,0,0,1155,1156, - 1,0,0,0,1156,1157,1,0,0,0,1157,1159,3,130,65,0,1158,1151,1,0,0,0, - 1158,1155,1,0,0,0,1159,129,1,0,0,0,1160,1165,3,156,78,0,1161,1162, - 5,121,0,0,1162,1164,3,156,78,0,1163,1161,1,0,0,0,1164,1167,1,0,0, - 0,1165,1163,1,0,0,0,1165,1166,1,0,0,0,1166,131,1,0,0,0,1167,1165, - 1,0,0,0,1168,1169,6,66,-1,0,1169,1178,3,136,68,0,1170,1178,3,134, - 67,0,1171,1172,5,131,0,0,1172,1173,3,44,22,0,1173,1174,5,150,0,0, - 1174,1178,1,0,0,0,1175,1178,3,120,60,0,1176,1178,3,160,80,0,1177, - 1168,1,0,0,0,1177,1170,1,0,0,0,1177,1171,1,0,0,0,1177,1175,1,0,0, - 0,1177,1176,1,0,0,0,1178,1187,1,0,0,0,1179,1183,10,3,0,0,1180,1184, - 3,154,77,0,1181,1182,5,6,0,0,1182,1184,3,156,78,0,1183,1180,1,0, - 0,0,1183,1181,1,0,0,0,1184,1186,1,0,0,0,1185,1179,1,0,0,0,1186,1189, - 1,0,0,0,1187,1185,1,0,0,0,1187,1188,1,0,0,0,1188,133,1,0,0,0,1189, - 1187,1,0,0,0,1190,1191,3,156,78,0,1191,1193,5,131,0,0,1192,1194, - 3,138,69,0,1193,1192,1,0,0,0,1193,1194,1,0,0,0,1194,1195,1,0,0,0, - 1195,1196,5,150,0,0,1196,135,1,0,0,0,1197,1198,3,140,70,0,1198,1199, - 5,121,0,0,1199,1201,1,0,0,0,1200,1197,1,0,0,0,1200,1201,1,0,0,0, - 1201,1202,1,0,0,0,1202,1203,3,156,78,0,1203,137,1,0,0,0,1204,1209, - 3,116,58,0,1205,1206,5,117,0,0,1206,1208,3,116,58,0,1207,1205,1, - 0,0,0,1208,1211,1,0,0,0,1209,1207,1,0,0,0,1209,1210,1,0,0,0,1210, - 1213,1,0,0,0,1211,1209,1,0,0,0,1212,1214,5,117,0,0,1213,1212,1,0, - 0,0,1213,1214,1,0,0,0,1214,139,1,0,0,0,1215,1216,3,156,78,0,1216, - 141,1,0,0,0,1217,1226,5,107,0,0,1218,1219,5,121,0,0,1219,1226,7, - 12,0,0,1220,1221,5,109,0,0,1221,1223,5,121,0,0,1222,1224,7,12,0, - 0,1223,1222,1,0,0,0,1223,1224,1,0,0,0,1224,1226,1,0,0,0,1225,1217, - 1,0,0,0,1225,1218,1,0,0,0,1225,1220,1,0,0,0,1226,143,1,0,0,0,1227, - 1229,7,13,0,0,1228,1227,1,0,0,0,1228,1229,1,0,0,0,1229,1236,1,0, - 0,0,1230,1237,3,142,71,0,1231,1237,5,108,0,0,1232,1237,5,109,0,0, - 1233,1237,5,110,0,0,1234,1237,5,44,0,0,1235,1237,5,58,0,0,1236,1230, - 1,0,0,0,1236,1231,1,0,0,0,1236,1232,1,0,0,0,1236,1233,1,0,0,0,1236, - 1234,1,0,0,0,1236,1235,1,0,0,0,1237,145,1,0,0,0,1238,1242,3,144, - 72,0,1239,1242,5,111,0,0,1240,1242,5,60,0,0,1241,1238,1,0,0,0,1241, - 1239,1,0,0,0,1241,1240,1,0,0,0,1242,147,1,0,0,0,1243,1244,7,14,0, - 0,1244,149,1,0,0,0,1245,1246,7,15,0,0,1246,151,1,0,0,0,1247,1248, - 7,16,0,0,1248,153,1,0,0,0,1249,1252,5,106,0,0,1250,1252,3,152,76, - 0,1251,1249,1,0,0,0,1251,1250,1,0,0,0,1252,155,1,0,0,0,1253,1257, - 5,106,0,0,1254,1257,3,148,74,0,1255,1257,3,150,75,0,1256,1253,1, - 0,0,0,1256,1254,1,0,0,0,1256,1255,1,0,0,0,1257,157,1,0,0,0,1258, - 1259,3,162,81,0,1259,1260,5,123,0,0,1260,1261,3,144,72,0,1261,159, - 1,0,0,0,1262,1263,5,129,0,0,1263,1264,3,116,58,0,1264,1265,5,148, - 0,0,1265,161,1,0,0,0,1266,1269,5,111,0,0,1267,1269,3,164,82,0,1268, - 1266,1,0,0,0,1268,1267,1,0,0,0,1269,163,1,0,0,0,1270,1274,5,143, - 0,0,1271,1273,3,166,83,0,1272,1271,1,0,0,0,1273,1276,1,0,0,0,1274, - 1272,1,0,0,0,1274,1275,1,0,0,0,1275,1277,1,0,0,0,1276,1274,1,0,0, - 0,1277,1278,5,145,0,0,1278,165,1,0,0,0,1279,1280,5,158,0,0,1280, - 1281,3,116,58,0,1281,1282,5,148,0,0,1282,1285,1,0,0,0,1283,1285, - 5,157,0,0,1284,1279,1,0,0,0,1284,1283,1,0,0,0,1285,167,1,0,0,0,1286, - 1290,5,144,0,0,1287,1289,3,170,85,0,1288,1287,1,0,0,0,1289,1292, - 1,0,0,0,1290,1288,1,0,0,0,1290,1291,1,0,0,0,1291,1293,1,0,0,0,1292, - 1290,1,0,0,0,1293,1294,5,0,0,1,1294,169,1,0,0,0,1295,1296,5,160, - 0,0,1296,1297,3,116,58,0,1297,1298,5,148,0,0,1298,1301,1,0,0,0,1299, - 1301,5,159,0,0,1300,1295,1,0,0,0,1300,1299,1,0,0,0,1301,171,1,0, - 0,0,167,175,182,191,198,202,216,220,223,227,230,237,241,250,255, - 264,272,279,283,289,294,302,309,315,327,335,349,353,358,368,377, - 380,384,387,391,394,397,400,403,407,411,414,417,420,424,427,436, - 442,463,480,497,503,509,520,522,533,536,542,550,556,558,562,567, - 570,573,577,581,584,586,589,593,597,600,602,604,609,620,626,633, - 638,642,646,652,654,661,669,672,675,694,708,724,728,739,743,754, - 758,765,769,776,780,785,794,798,822,839,845,848,851,861,867,870, - 873,881,884,888,891,905,922,927,932,938,945,957,961,964,973,987, - 1003,1032,1040,1042,1044,1053,1057,1066,1070,1074,1079,1086,1097, - 1106,1113,1126,1133,1137,1149,1155,1158,1165,1177,1183,1187,1193, - 1200,1209,1213,1223,1225,1228,1236,1241,1251,1256,1268,1274,1284, - 1290,1300 + 85,7,85,2,86,7,86,1,0,5,0,176,8,0,10,0,12,0,179,9,0,1,0,1,0,1,1, + 1,1,3,1,185,8,1,1,2,1,2,1,3,1,3,1,3,1,3,1,3,3,3,194,8,3,1,4,1,4, + 1,4,5,4,199,8,4,10,4,12,4,202,9,4,1,4,3,4,205,8,4,1,5,1,5,1,5,1, + 5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,1,5,3,5,219,8,5,1,6,1,6,3,6,223,8, + 6,1,6,3,6,226,8,6,1,7,1,7,3,7,230,8,7,1,7,3,7,233,8,7,1,8,1,8,1, + 8,1,8,1,8,3,8,240,8,8,1,8,1,8,3,8,244,8,8,1,8,1,8,1,9,1,9,1,9,5, + 9,251,8,9,10,9,12,9,254,9,9,1,9,1,9,3,9,258,8,9,1,10,1,10,1,10,1, + 10,1,10,1,10,1,10,3,10,267,8,10,1,11,1,11,1,11,1,11,1,11,1,11,3, + 11,275,8,11,1,12,1,12,1,12,1,12,1,12,3,12,282,8,12,1,12,1,12,3,12, + 286,8,12,1,12,1,12,1,12,1,12,3,12,292,8,12,1,12,1,12,1,12,3,12,297, + 8,12,1,13,1,13,1,13,1,13,1,13,1,13,3,13,305,8,13,1,13,1,13,1,13, + 1,13,1,13,3,13,312,8,13,1,14,1,14,1,14,1,14,3,14,318,8,14,1,14,1, + 14,1,14,1,15,1,15,1,15,1,15,1,15,1,16,1,16,3,16,330,8,16,1,17,1, + 17,1,18,1,18,5,18,336,8,18,10,18,12,18,339,9,18,1,18,1,18,1,19,1, + 19,1,19,1,19,1,20,1,20,1,20,5,20,350,8,20,10,20,12,20,353,9,20,1, + 20,3,20,356,8,20,1,21,1,21,1,21,3,21,361,8,21,1,21,1,21,1,22,1,22, + 1,22,1,22,1,22,1,22,3,22,371,8,22,1,23,1,23,1,23,1,23,3,23,377,8, + 23,1,23,1,23,1,24,1,24,5,24,383,8,24,10,24,12,24,386,9,24,1,25,3, + 25,389,8,25,1,25,1,25,3,25,393,8,25,1,25,3,25,396,8,25,1,25,1,25, + 3,25,400,8,25,1,25,3,25,403,8,25,1,25,3,25,406,8,25,1,25,3,25,409, + 8,25,1,25,3,25,412,8,25,1,25,1,25,3,25,416,8,25,1,25,1,25,3,25,420, + 8,25,1,25,3,25,423,8,25,1,25,3,25,426,8,25,1,25,3,25,429,8,25,1, + 25,1,25,3,25,433,8,25,1,25,3,25,436,8,25,1,26,1,26,1,26,1,27,1,27, + 1,27,1,27,3,27,445,8,27,1,28,1,28,1,28,1,29,3,29,451,8,29,1,29,1, + 29,1,29,1,29,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1,30,1, + 30,1,30,1,30,5,30,470,8,30,10,30,12,30,473,9,30,1,31,1,31,1,31,1, + 32,1,32,1,32,1,33,1,33,1,33,1,33,1,33,1,33,1,33,1,33,3,33,489,8, + 33,1,34,1,34,1,34,1,35,1,35,1,35,1,35,1,36,1,36,1,36,1,36,1,37,1, + 37,1,37,1,37,3,37,506,8,37,1,37,1,37,1,37,1,37,3,37,512,8,37,1,37, + 1,37,1,37,1,37,3,37,518,8,37,1,37,1,37,1,37,1,37,1,37,1,37,1,37, + 1,37,1,37,3,37,529,8,37,3,37,531,8,37,1,38,1,38,1,38,1,39,1,39,1, + 39,1,40,1,40,1,40,3,40,542,8,40,1,40,3,40,545,8,40,1,40,1,40,1,40, + 1,40,3,40,551,8,40,1,40,1,40,1,40,1,40,1,40,1,40,3,40,559,8,40,1, + 40,1,40,1,40,1,40,5,40,565,8,40,10,40,12,40,568,9,40,1,41,3,41,571, + 8,41,1,41,1,41,1,41,3,41,576,8,41,1,41,3,41,579,8,41,1,41,3,41,582, + 8,41,1,41,1,41,3,41,586,8,41,1,41,1,41,3,41,590,8,41,1,41,3,41,593, + 8,41,3,41,595,8,41,1,41,3,41,598,8,41,1,41,1,41,3,41,602,8,41,1, + 41,1,41,3,41,606,8,41,1,41,3,41,609,8,41,3,41,611,8,41,3,41,613, + 8,41,1,42,1,42,1,42,3,42,618,8,42,1,43,1,43,1,43,1,43,1,43,1,43, + 1,43,1,43,1,43,3,43,629,8,43,1,44,1,44,1,44,1,44,3,44,635,8,44,1, + 45,1,45,1,45,5,45,640,8,45,10,45,12,45,643,9,45,1,46,1,46,3,46,647, + 8,46,1,46,1,46,3,46,651,8,46,1,46,1,46,3,46,655,8,46,1,47,1,47,1, + 47,1,47,3,47,661,8,47,3,47,663,8,47,1,48,1,48,1,48,5,48,668,8,48, + 10,48,12,48,671,9,48,1,49,1,49,1,49,1,49,1,50,3,50,678,8,50,1,50, + 3,50,681,8,50,1,50,3,50,684,8,50,1,51,1,51,1,51,1,51,1,52,1,52,1, + 52,1,52,1,53,1,53,1,53,1,54,1,54,1,54,1,54,1,54,1,54,3,54,703,8, + 54,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,1,55,3, + 55,717,8,55,1,56,1,56,1,56,1,57,1,57,1,57,1,57,1,57,1,57,1,57,1, + 57,1,57,5,57,731,8,57,10,57,12,57,734,9,57,1,57,3,57,737,8,57,1, + 57,1,57,1,57,1,57,1,57,1,57,1,57,5,57,746,8,57,10,57,12,57,749,9, + 57,1,57,3,57,752,8,57,1,57,1,57,1,57,1,57,1,57,1,57,1,57,5,57,761, + 8,57,10,57,12,57,764,9,57,1,57,3,57,767,8,57,1,57,1,57,1,57,1,57, + 1,57,3,57,774,8,57,1,57,1,57,3,57,778,8,57,1,58,1,58,1,58,5,58,783, + 8,58,10,58,12,58,786,9,58,1,58,3,58,789,8,58,1,59,1,59,1,59,3,59, + 794,8,59,1,59,1,59,1,59,1,59,1,59,4,59,801,8,59,11,59,12,59,802, + 1,59,1,59,3,59,807,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,3,59,831,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,3,59,848,8,59,1,59,1,59,1,59,1,59, + 3,59,854,8,59,1,59,3,59,857,8,59,1,59,3,59,860,8,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,3,59,870,8,59,1,59,1,59,1,59,1,59,3, + 59,876,8,59,1,59,3,59,879,8,59,1,59,3,59,882,8,59,1,59,1,59,1,59, + 1,59,1,59,1,59,3,59,890,8,59,1,59,3,59,893,8,59,1,59,1,59,3,59,897, + 8,59,1,59,3,59,900,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,3,59,914,8,59,1,59,1,59,1,59,1,59,1,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,931,8,59,1,59, + 1,59,1,59,3,59,936,8,59,1,59,1,59,1,59,3,59,941,8,59,1,59,1,59,1, + 59,1,59,3,59,947,8,59,1,59,1,59,1,59,1,59,1,59,3,59,954,8,59,1,59, + 1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,966,8,59,1,59, + 1,59,3,59,970,8,59,1,59,3,59,973,8,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,3,59,982,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,3,59,996,8,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1012,8,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1, + 59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1041, + 8,59,1,59,1,59,1,59,1,59,1,59,1,59,3,59,1049,8,59,5,59,1051,8,59, + 10,59,12,59,1054,9,59,1,60,1,60,1,60,1,60,5,60,1060,8,60,10,60,12, + 60,1063,9,60,1,60,3,60,1066,8,60,1,60,1,60,1,60,1,60,1,60,5,60,1073, + 8,60,10,60,12,60,1076,9,60,1,60,3,60,1079,8,60,1,60,1,60,3,60,1083, + 8,60,1,60,1,60,1,60,3,60,1088,8,60,1,61,1,61,1,61,5,61,1093,8,61, + 10,61,12,61,1096,9,61,1,61,1,61,1,61,1,61,1,61,1,61,5,61,1104,8, + 61,10,61,12,61,1107,9,61,1,61,1,61,1,61,1,61,1,61,1,61,3,61,1115, + 8,61,1,61,1,61,1,61,1,61,1,61,3,61,1122,8,61,1,62,1,62,1,62,1,62, + 1,62,1,62,1,62,1,62,1,62,1,62,1,62,3,62,1135,8,62,1,63,1,63,1,63, + 5,63,1140,8,63,10,63,12,63,1143,9,63,1,63,3,63,1146,8,63,1,64,1, + 64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,1,64,3,64,1158,8,64,1,65,1, + 65,1,65,1,65,3,65,1164,8,65,1,65,3,65,1167,8,65,1,66,1,66,1,66,5, + 66,1172,8,66,10,66,12,66,1175,9,66,1,67,1,67,1,67,1,67,1,67,1,67, + 1,67,1,67,1,67,3,67,1186,8,67,1,67,1,67,1,67,1,67,3,67,1192,8,67, + 5,67,1194,8,67,10,67,12,67,1197,9,67,1,68,1,68,1,68,3,68,1202,8, + 68,1,68,1,68,1,69,1,69,1,69,3,69,1209,8,69,1,69,1,69,1,70,1,70,1, + 70,5,70,1216,8,70,10,70,12,70,1219,9,70,1,70,3,70,1222,8,70,1,71, + 1,71,1,72,1,72,1,72,1,72,1,72,1,72,3,72,1232,8,72,3,72,1234,8,72, + 1,73,3,73,1237,8,73,1,73,1,73,1,73,1,73,1,73,1,73,3,73,1245,8,73, + 1,74,1,74,1,74,3,74,1250,8,74,1,75,1,75,1,76,1,76,1,77,1,77,1,78, + 1,78,3,78,1260,8,78,1,79,1,79,1,79,3,79,1265,8,79,1,80,1,80,1,80, + 1,80,1,81,1,81,1,81,1,81,1,82,1,82,3,82,1277,8,82,1,83,1,83,5,83, + 1281,8,83,10,83,12,83,1284,9,83,1,83,1,83,1,84,1,84,1,84,1,84,1, + 84,3,84,1293,8,84,1,85,1,85,5,85,1297,8,85,10,85,12,85,1300,9,85, + 1,85,1,85,1,86,1,86,1,86,1,86,1,86,3,86,1309,8,86,1,86,0,3,80,118, + 134,87,0,2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40, + 42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84, + 86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120, + 122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152, + 154,156,158,160,162,164,166,168,170,172,0,17,2,0,32,32,37,37,2,0, + 18,18,77,77,2,0,46,46,54,54,3,0,1,1,4,4,8,8,4,0,1,1,3,4,8,8,83,83, + 2,0,54,54,76,76,2,0,1,1,4,4,2,0,7,7,22,23,2,0,31,31,52,52,2,0,74, + 74,79,79,3,0,10,10,53,53,93,93,2,0,43,43,56,56,1,0,110,111,2,0,121, + 121,142,142,7,0,21,21,40,40,58,59,73,73,81,81,100,100,106,106,19, + 0,1,13,15,20,22,26,28,29,31,31,33,36,38,39,41,44,46,46,48,54,56, + 57,61,61,63,72,74,80,82,86,88,95,97,99,101,102,104,105,4,0,20,20, + 31,31,41,41,51,51,1484,0,177,1,0,0,0,2,184,1,0,0,0,4,186,1,0,0,0, + 6,188,1,0,0,0,8,195,1,0,0,0,10,218,1,0,0,0,12,220,1,0,0,0,14,227, + 1,0,0,0,16,234,1,0,0,0,18,247,1,0,0,0,20,259,1,0,0,0,22,268,1,0, + 0,0,24,276,1,0,0,0,26,298,1,0,0,0,28,313,1,0,0,0,30,322,1,0,0,0, + 32,327,1,0,0,0,34,331,1,0,0,0,36,333,1,0,0,0,38,342,1,0,0,0,40,346, + 1,0,0,0,42,360,1,0,0,0,44,370,1,0,0,0,46,376,1,0,0,0,48,380,1,0, + 0,0,50,388,1,0,0,0,52,437,1,0,0,0,54,440,1,0,0,0,56,446,1,0,0,0, + 58,450,1,0,0,0,60,456,1,0,0,0,62,474,1,0,0,0,64,477,1,0,0,0,66,480, + 1,0,0,0,68,490,1,0,0,0,70,493,1,0,0,0,72,497,1,0,0,0,74,530,1,0, + 0,0,76,532,1,0,0,0,78,535,1,0,0,0,80,550,1,0,0,0,82,612,1,0,0,0, + 84,617,1,0,0,0,86,628,1,0,0,0,88,630,1,0,0,0,90,636,1,0,0,0,92,644, + 1,0,0,0,94,662,1,0,0,0,96,664,1,0,0,0,98,672,1,0,0,0,100,677,1,0, + 0,0,102,685,1,0,0,0,104,689,1,0,0,0,106,693,1,0,0,0,108,702,1,0, + 0,0,110,716,1,0,0,0,112,718,1,0,0,0,114,777,1,0,0,0,116,779,1,0, + 0,0,118,940,1,0,0,0,120,1082,1,0,0,0,122,1121,1,0,0,0,124,1134,1, + 0,0,0,126,1136,1,0,0,0,128,1157,1,0,0,0,130,1166,1,0,0,0,132,1168, + 1,0,0,0,134,1185,1,0,0,0,136,1198,1,0,0,0,138,1208,1,0,0,0,140,1212, + 1,0,0,0,142,1223,1,0,0,0,144,1233,1,0,0,0,146,1236,1,0,0,0,148,1249, + 1,0,0,0,150,1251,1,0,0,0,152,1253,1,0,0,0,154,1255,1,0,0,0,156,1259, + 1,0,0,0,158,1264,1,0,0,0,160,1266,1,0,0,0,162,1270,1,0,0,0,164,1276, + 1,0,0,0,166,1278,1,0,0,0,168,1292,1,0,0,0,170,1294,1,0,0,0,172,1308, + 1,0,0,0,174,176,3,2,1,0,175,174,1,0,0,0,176,179,1,0,0,0,177,175, + 1,0,0,0,177,178,1,0,0,0,178,180,1,0,0,0,179,177,1,0,0,0,180,181, + 5,0,0,1,181,1,1,0,0,0,182,185,3,6,3,0,183,185,3,10,5,0,184,182,1, + 0,0,0,184,183,1,0,0,0,185,3,1,0,0,0,186,187,3,118,59,0,187,5,1,0, + 0,0,188,189,5,55,0,0,189,193,3,158,79,0,190,191,5,118,0,0,191,192, + 5,125,0,0,192,194,3,4,2,0,193,190,1,0,0,0,193,194,1,0,0,0,194,7, + 1,0,0,0,195,200,3,158,79,0,196,197,5,119,0,0,197,199,3,158,79,0, + 198,196,1,0,0,0,199,202,1,0,0,0,200,198,1,0,0,0,200,201,1,0,0,0, + 201,204,1,0,0,0,202,200,1,0,0,0,203,205,5,119,0,0,204,203,1,0,0, + 0,204,205,1,0,0,0,205,9,1,0,0,0,206,219,3,12,6,0,207,219,3,14,7, + 0,208,219,3,18,9,0,209,219,3,20,10,0,210,219,3,22,11,0,211,219,3, + 26,13,0,212,219,3,24,12,0,213,219,3,28,14,0,214,219,3,30,15,0,215, + 219,3,36,18,0,216,219,3,32,16,0,217,219,3,34,17,0,218,206,1,0,0, + 0,218,207,1,0,0,0,218,208,1,0,0,0,218,209,1,0,0,0,218,210,1,0,0, + 0,218,211,1,0,0,0,218,212,1,0,0,0,218,213,1,0,0,0,218,214,1,0,0, + 0,218,215,1,0,0,0,218,216,1,0,0,0,218,217,1,0,0,0,219,11,1,0,0,0, + 220,222,5,75,0,0,221,223,3,4,2,0,222,221,1,0,0,0,222,223,1,0,0,0, + 223,225,1,0,0,0,224,226,5,153,0,0,225,224,1,0,0,0,225,226,1,0,0, + 0,226,13,1,0,0,0,227,229,5,87,0,0,228,230,3,4,2,0,229,228,1,0,0, + 0,229,230,1,0,0,0,230,232,1,0,0,0,231,233,5,153,0,0,232,231,1,0, + 0,0,232,233,1,0,0,0,233,15,1,0,0,0,234,243,5,14,0,0,235,236,5,133, + 0,0,236,239,3,158,79,0,237,238,5,118,0,0,238,240,3,158,79,0,239, + 237,1,0,0,0,239,240,1,0,0,0,240,241,1,0,0,0,241,242,5,152,0,0,242, + 244,1,0,0,0,243,235,1,0,0,0,243,244,1,0,0,0,244,245,1,0,0,0,245, + 246,3,36,18,0,246,17,1,0,0,0,247,248,5,96,0,0,248,252,3,36,18,0, + 249,251,3,16,8,0,250,249,1,0,0,0,251,254,1,0,0,0,252,250,1,0,0,0, + 252,253,1,0,0,0,253,257,1,0,0,0,254,252,1,0,0,0,255,256,5,30,0,0, + 256,258,3,36,18,0,257,255,1,0,0,0,257,258,1,0,0,0,258,19,1,0,0,0, + 259,260,5,42,0,0,260,261,5,133,0,0,261,262,3,4,2,0,262,263,5,152, + 0,0,263,266,3,10,5,0,264,265,5,25,0,0,265,267,3,10,5,0,266,264,1, + 0,0,0,266,267,1,0,0,0,267,21,1,0,0,0,268,269,5,103,0,0,269,270,5, + 133,0,0,270,271,3,4,2,0,271,272,5,152,0,0,272,274,3,10,5,0,273,275, + 5,153,0,0,274,273,1,0,0,0,274,275,1,0,0,0,275,23,1,0,0,0,276,277, + 5,34,0,0,277,281,5,133,0,0,278,282,3,6,3,0,279,282,3,30,15,0,280, + 282,3,4,2,0,281,278,1,0,0,0,281,279,1,0,0,0,281,280,1,0,0,0,281, + 282,1,0,0,0,282,283,1,0,0,0,283,285,5,153,0,0,284,286,3,4,2,0,285, + 284,1,0,0,0,285,286,1,0,0,0,286,287,1,0,0,0,287,291,5,153,0,0,288, + 292,3,6,3,0,289,292,3,30,15,0,290,292,3,4,2,0,291,288,1,0,0,0,291, + 289,1,0,0,0,291,290,1,0,0,0,291,292,1,0,0,0,292,293,1,0,0,0,293, + 294,5,152,0,0,294,296,3,10,5,0,295,297,5,153,0,0,296,295,1,0,0,0, + 296,297,1,0,0,0,297,25,1,0,0,0,298,299,5,34,0,0,299,300,5,133,0, + 0,300,301,5,55,0,0,301,304,3,158,79,0,302,303,5,119,0,0,303,305, + 3,158,79,0,304,302,1,0,0,0,304,305,1,0,0,0,305,306,1,0,0,0,306,307, + 5,44,0,0,307,308,3,4,2,0,308,309,5,152,0,0,309,311,3,10,5,0,310, + 312,5,153,0,0,311,310,1,0,0,0,311,312,1,0,0,0,312,27,1,0,0,0,313, + 314,7,0,0,0,314,315,3,158,79,0,315,317,5,133,0,0,316,318,3,8,4,0, + 317,316,1,0,0,0,317,318,1,0,0,0,318,319,1,0,0,0,319,320,5,152,0, + 0,320,321,3,36,18,0,321,29,1,0,0,0,322,323,3,4,2,0,323,324,5,118, + 0,0,324,325,5,125,0,0,325,326,3,4,2,0,326,31,1,0,0,0,327,329,3,4, + 2,0,328,330,5,153,0,0,329,328,1,0,0,0,329,330,1,0,0,0,330,33,1,0, + 0,0,331,332,5,153,0,0,332,35,1,0,0,0,333,337,5,131,0,0,334,336,3, + 2,1,0,335,334,1,0,0,0,336,339,1,0,0,0,337,335,1,0,0,0,337,338,1, + 0,0,0,338,340,1,0,0,0,339,337,1,0,0,0,340,341,5,150,0,0,341,37,1, + 0,0,0,342,343,3,4,2,0,343,344,5,118,0,0,344,345,3,4,2,0,345,39,1, + 0,0,0,346,351,3,38,19,0,347,348,5,119,0,0,348,350,3,38,19,0,349, + 347,1,0,0,0,350,353,1,0,0,0,351,349,1,0,0,0,351,352,1,0,0,0,352, + 355,1,0,0,0,353,351,1,0,0,0,354,356,5,119,0,0,355,354,1,0,0,0,355, + 356,1,0,0,0,356,41,1,0,0,0,357,361,3,48,24,0,358,361,3,50,25,0,359, + 361,3,122,61,0,360,357,1,0,0,0,360,358,1,0,0,0,360,359,1,0,0,0,361, + 362,1,0,0,0,362,363,5,0,0,1,363,43,1,0,0,0,364,371,3,50,25,0,365, + 366,5,133,0,0,366,367,3,48,24,0,367,368,5,152,0,0,368,371,1,0,0, + 0,369,371,3,162,81,0,370,364,1,0,0,0,370,365,1,0,0,0,370,369,1,0, + 0,0,371,45,1,0,0,0,372,377,5,27,0,0,373,374,5,98,0,0,374,377,5,1, + 0,0,375,377,5,47,0,0,376,372,1,0,0,0,376,373,1,0,0,0,376,375,1,0, + 0,0,377,378,1,0,0,0,378,379,3,44,22,0,379,47,1,0,0,0,380,384,3,44, + 22,0,381,383,3,46,23,0,382,381,1,0,0,0,383,386,1,0,0,0,384,382,1, + 0,0,0,384,385,1,0,0,0,385,49,1,0,0,0,386,384,1,0,0,0,387,389,3,52, + 26,0,388,387,1,0,0,0,388,389,1,0,0,0,389,390,1,0,0,0,390,392,5,82, + 0,0,391,393,5,24,0,0,392,391,1,0,0,0,392,393,1,0,0,0,393,395,1,0, + 0,0,394,396,3,54,27,0,395,394,1,0,0,0,395,396,1,0,0,0,396,397,1, + 0,0,0,397,399,3,116,58,0,398,400,3,56,28,0,399,398,1,0,0,0,399,400, + 1,0,0,0,400,402,1,0,0,0,401,403,3,58,29,0,402,401,1,0,0,0,402,403, + 1,0,0,0,403,405,1,0,0,0,404,406,3,62,31,0,405,404,1,0,0,0,405,406, + 1,0,0,0,406,408,1,0,0,0,407,409,3,64,32,0,408,407,1,0,0,0,408,409, + 1,0,0,0,409,411,1,0,0,0,410,412,3,66,33,0,411,410,1,0,0,0,411,412, + 1,0,0,0,412,415,1,0,0,0,413,414,5,105,0,0,414,416,7,1,0,0,415,413, + 1,0,0,0,415,416,1,0,0,0,416,419,1,0,0,0,417,418,5,105,0,0,418,420, + 5,92,0,0,419,417,1,0,0,0,419,420,1,0,0,0,420,422,1,0,0,0,421,423, + 3,68,34,0,422,421,1,0,0,0,422,423,1,0,0,0,423,425,1,0,0,0,424,426, + 3,60,30,0,425,424,1,0,0,0,425,426,1,0,0,0,426,428,1,0,0,0,427,429, + 3,70,35,0,428,427,1,0,0,0,428,429,1,0,0,0,429,432,1,0,0,0,430,433, + 3,74,37,0,431,433,3,76,38,0,432,430,1,0,0,0,432,431,1,0,0,0,432, + 433,1,0,0,0,433,435,1,0,0,0,434,436,3,78,39,0,435,434,1,0,0,0,435, + 436,1,0,0,0,436,51,1,0,0,0,437,438,5,105,0,0,438,439,3,126,63,0, + 439,53,1,0,0,0,440,441,5,91,0,0,441,444,5,111,0,0,442,443,5,105, + 0,0,443,445,5,88,0,0,444,442,1,0,0,0,444,445,1,0,0,0,445,55,1,0, + 0,0,446,447,5,35,0,0,447,448,3,80,40,0,448,57,1,0,0,0,449,451,7, + 2,0,0,450,449,1,0,0,0,450,451,1,0,0,0,451,452,1,0,0,0,452,453,5, + 5,0,0,453,454,5,50,0,0,454,455,3,116,58,0,455,59,1,0,0,0,456,457, + 5,104,0,0,457,458,3,158,79,0,458,459,5,6,0,0,459,460,5,133,0,0,460, + 461,3,100,50,0,461,471,5,152,0,0,462,463,5,119,0,0,463,464,3,158, + 79,0,464,465,5,6,0,0,465,466,5,133,0,0,466,467,3,100,50,0,467,468, + 5,152,0,0,468,470,1,0,0,0,469,462,1,0,0,0,470,473,1,0,0,0,471,469, + 1,0,0,0,471,472,1,0,0,0,472,61,1,0,0,0,473,471,1,0,0,0,474,475,5, + 72,0,0,475,476,3,118,59,0,476,63,1,0,0,0,477,478,5,102,0,0,478,479, + 3,118,59,0,479,65,1,0,0,0,480,481,5,38,0,0,481,488,5,11,0,0,482, + 483,7,1,0,0,483,484,5,133,0,0,484,485,3,116,58,0,485,486,5,152,0, + 0,486,489,1,0,0,0,487,489,3,116,58,0,488,482,1,0,0,0,488,487,1,0, + 0,0,489,67,1,0,0,0,490,491,5,39,0,0,491,492,3,118,59,0,492,69,1, + 0,0,0,493,494,5,67,0,0,494,495,5,11,0,0,495,496,3,90,45,0,496,71, + 1,0,0,0,497,498,5,67,0,0,498,499,5,11,0,0,499,500,3,116,58,0,500, + 73,1,0,0,0,501,502,5,57,0,0,502,505,3,118,59,0,503,504,5,119,0,0, + 504,506,3,118,59,0,505,503,1,0,0,0,505,506,1,0,0,0,506,511,1,0,0, + 0,507,508,5,105,0,0,508,512,5,88,0,0,509,510,5,11,0,0,510,512,3, + 116,58,0,511,507,1,0,0,0,511,509,1,0,0,0,511,512,1,0,0,0,512,531, + 1,0,0,0,513,514,5,57,0,0,514,517,3,118,59,0,515,516,5,105,0,0,516, + 518,5,88,0,0,517,515,1,0,0,0,517,518,1,0,0,0,518,519,1,0,0,0,519, + 520,5,64,0,0,520,521,3,118,59,0,521,531,1,0,0,0,522,523,5,57,0,0, + 523,524,3,118,59,0,524,525,5,64,0,0,525,528,3,118,59,0,526,527,5, + 11,0,0,527,529,3,116,58,0,528,526,1,0,0,0,528,529,1,0,0,0,529,531, + 1,0,0,0,530,501,1,0,0,0,530,513,1,0,0,0,530,522,1,0,0,0,531,75,1, + 0,0,0,532,533,5,64,0,0,533,534,3,118,59,0,534,77,1,0,0,0,535,536, + 5,84,0,0,536,537,3,96,48,0,537,79,1,0,0,0,538,539,6,40,-1,0,539, + 541,3,134,67,0,540,542,5,29,0,0,541,540,1,0,0,0,541,542,1,0,0,0, + 542,544,1,0,0,0,543,545,3,88,44,0,544,543,1,0,0,0,544,545,1,0,0, + 0,545,551,1,0,0,0,546,547,5,133,0,0,547,548,3,80,40,0,548,549,5, + 152,0,0,549,551,1,0,0,0,550,538,1,0,0,0,550,546,1,0,0,0,551,566, + 1,0,0,0,552,553,10,3,0,0,553,554,3,84,42,0,554,555,3,80,40,4,555, + 565,1,0,0,0,556,558,10,4,0,0,557,559,3,82,41,0,558,557,1,0,0,0,558, + 559,1,0,0,0,559,560,1,0,0,0,560,561,5,50,0,0,561,562,3,80,40,0,562, + 563,3,86,43,0,563,565,1,0,0,0,564,552,1,0,0,0,564,556,1,0,0,0,565, + 568,1,0,0,0,566,564,1,0,0,0,566,567,1,0,0,0,567,81,1,0,0,0,568,566, + 1,0,0,0,569,571,7,3,0,0,570,569,1,0,0,0,570,571,1,0,0,0,571,572, + 1,0,0,0,572,579,5,46,0,0,573,575,5,46,0,0,574,576,7,3,0,0,575,574, + 1,0,0,0,575,576,1,0,0,0,576,579,1,0,0,0,577,579,7,3,0,0,578,570, + 1,0,0,0,578,573,1,0,0,0,578,577,1,0,0,0,579,613,1,0,0,0,580,582, + 7,4,0,0,581,580,1,0,0,0,581,582,1,0,0,0,582,583,1,0,0,0,583,585, + 7,5,0,0,584,586,5,68,0,0,585,584,1,0,0,0,585,586,1,0,0,0,586,595, + 1,0,0,0,587,589,7,5,0,0,588,590,5,68,0,0,589,588,1,0,0,0,589,590, + 1,0,0,0,590,592,1,0,0,0,591,593,7,4,0,0,592,591,1,0,0,0,592,593, + 1,0,0,0,593,595,1,0,0,0,594,581,1,0,0,0,594,587,1,0,0,0,595,613, + 1,0,0,0,596,598,7,6,0,0,597,596,1,0,0,0,597,598,1,0,0,0,598,599, + 1,0,0,0,599,601,5,36,0,0,600,602,5,68,0,0,601,600,1,0,0,0,601,602, + 1,0,0,0,602,611,1,0,0,0,603,605,5,36,0,0,604,606,5,68,0,0,605,604, + 1,0,0,0,605,606,1,0,0,0,606,608,1,0,0,0,607,609,7,6,0,0,608,607, + 1,0,0,0,608,609,1,0,0,0,609,611,1,0,0,0,610,597,1,0,0,0,610,603, + 1,0,0,0,611,613,1,0,0,0,612,578,1,0,0,0,612,594,1,0,0,0,612,610, + 1,0,0,0,613,83,1,0,0,0,614,615,5,17,0,0,615,618,5,50,0,0,616,618, + 5,119,0,0,617,614,1,0,0,0,617,616,1,0,0,0,618,85,1,0,0,0,619,620, + 5,65,0,0,620,629,3,116,58,0,621,622,5,99,0,0,622,623,5,133,0,0,623, + 624,3,116,58,0,624,625,5,152,0,0,625,629,1,0,0,0,626,627,5,99,0, + 0,627,629,3,116,58,0,628,619,1,0,0,0,628,621,1,0,0,0,628,626,1,0, + 0,0,629,87,1,0,0,0,630,631,5,80,0,0,631,634,3,94,47,0,632,633,5, + 64,0,0,633,635,3,94,47,0,634,632,1,0,0,0,634,635,1,0,0,0,635,89, + 1,0,0,0,636,641,3,92,46,0,637,638,5,119,0,0,638,640,3,92,46,0,639, + 637,1,0,0,0,640,643,1,0,0,0,641,639,1,0,0,0,641,642,1,0,0,0,642, + 91,1,0,0,0,643,641,1,0,0,0,644,646,3,118,59,0,645,647,7,7,0,0,646, + 645,1,0,0,0,646,647,1,0,0,0,647,650,1,0,0,0,648,649,5,63,0,0,649, + 651,7,8,0,0,650,648,1,0,0,0,650,651,1,0,0,0,651,654,1,0,0,0,652, + 653,5,16,0,0,653,655,5,113,0,0,654,652,1,0,0,0,654,655,1,0,0,0,655, + 93,1,0,0,0,656,663,3,162,81,0,657,660,3,146,73,0,658,659,5,154,0, + 0,659,661,3,146,73,0,660,658,1,0,0,0,660,661,1,0,0,0,661,663,1,0, + 0,0,662,656,1,0,0,0,662,657,1,0,0,0,663,95,1,0,0,0,664,669,3,98, + 49,0,665,666,5,119,0,0,666,668,3,98,49,0,667,665,1,0,0,0,668,671, + 1,0,0,0,669,667,1,0,0,0,669,670,1,0,0,0,670,97,1,0,0,0,671,669,1, + 0,0,0,672,673,3,158,79,0,673,674,5,125,0,0,674,675,3,148,74,0,675, + 99,1,0,0,0,676,678,3,102,51,0,677,676,1,0,0,0,677,678,1,0,0,0,678, + 680,1,0,0,0,679,681,3,104,52,0,680,679,1,0,0,0,680,681,1,0,0,0,681, + 683,1,0,0,0,682,684,3,106,53,0,683,682,1,0,0,0,683,684,1,0,0,0,684, + 101,1,0,0,0,685,686,5,70,0,0,686,687,5,11,0,0,687,688,3,116,58,0, + 688,103,1,0,0,0,689,690,5,67,0,0,690,691,5,11,0,0,691,692,3,90,45, + 0,692,105,1,0,0,0,693,694,7,9,0,0,694,695,3,108,54,0,695,107,1,0, + 0,0,696,703,3,110,55,0,697,698,5,9,0,0,698,699,3,110,55,0,699,700, + 5,2,0,0,700,701,3,110,55,0,701,703,1,0,0,0,702,696,1,0,0,0,702,697, + 1,0,0,0,703,109,1,0,0,0,704,705,5,19,0,0,705,717,5,78,0,0,706,707, + 5,97,0,0,707,717,5,71,0,0,708,709,5,97,0,0,709,717,5,33,0,0,710, + 711,3,146,73,0,711,712,5,71,0,0,712,717,1,0,0,0,713,714,3,146,73, + 0,714,715,5,33,0,0,715,717,1,0,0,0,716,704,1,0,0,0,716,706,1,0,0, + 0,716,708,1,0,0,0,716,710,1,0,0,0,716,713,1,0,0,0,717,111,1,0,0, + 0,718,719,3,118,59,0,719,720,5,0,0,1,720,113,1,0,0,0,721,778,3,158, + 79,0,722,723,3,158,79,0,723,724,5,133,0,0,724,725,3,158,79,0,725, + 732,3,114,57,0,726,727,5,119,0,0,727,728,3,158,79,0,728,729,3,114, + 57,0,729,731,1,0,0,0,730,726,1,0,0,0,731,734,1,0,0,0,732,730,1,0, + 0,0,732,733,1,0,0,0,733,736,1,0,0,0,734,732,1,0,0,0,735,737,5,119, + 0,0,736,735,1,0,0,0,736,737,1,0,0,0,737,738,1,0,0,0,738,739,5,152, + 0,0,739,778,1,0,0,0,740,741,3,158,79,0,741,742,5,133,0,0,742,747, + 3,160,80,0,743,744,5,119,0,0,744,746,3,160,80,0,745,743,1,0,0,0, + 746,749,1,0,0,0,747,745,1,0,0,0,747,748,1,0,0,0,748,751,1,0,0,0, + 749,747,1,0,0,0,750,752,5,119,0,0,751,750,1,0,0,0,751,752,1,0,0, + 0,752,753,1,0,0,0,753,754,5,152,0,0,754,778,1,0,0,0,755,756,3,158, + 79,0,756,757,5,133,0,0,757,762,3,114,57,0,758,759,5,119,0,0,759, + 761,3,114,57,0,760,758,1,0,0,0,761,764,1,0,0,0,762,760,1,0,0,0,762, + 763,1,0,0,0,763,766,1,0,0,0,764,762,1,0,0,0,765,767,5,119,0,0,766, + 765,1,0,0,0,766,767,1,0,0,0,767,768,1,0,0,0,768,769,5,152,0,0,769, + 778,1,0,0,0,770,771,3,158,79,0,771,773,5,133,0,0,772,774,3,116,58, + 0,773,772,1,0,0,0,773,774,1,0,0,0,774,775,1,0,0,0,775,776,5,152, + 0,0,776,778,1,0,0,0,777,721,1,0,0,0,777,722,1,0,0,0,777,740,1,0, + 0,0,777,755,1,0,0,0,777,770,1,0,0,0,778,115,1,0,0,0,779,784,3,118, + 59,0,780,781,5,119,0,0,781,783,3,118,59,0,782,780,1,0,0,0,783,786, + 1,0,0,0,784,782,1,0,0,0,784,785,1,0,0,0,785,788,1,0,0,0,786,784, + 1,0,0,0,787,789,5,119,0,0,788,787,1,0,0,0,788,789,1,0,0,0,789,117, + 1,0,0,0,790,791,6,59,-1,0,791,793,5,12,0,0,792,794,3,118,59,0,793, + 792,1,0,0,0,793,794,1,0,0,0,794,800,1,0,0,0,795,796,5,101,0,0,796, + 797,3,118,59,0,797,798,5,86,0,0,798,799,3,118,59,0,799,801,1,0,0, + 0,800,795,1,0,0,0,801,802,1,0,0,0,802,800,1,0,0,0,802,803,1,0,0, + 0,803,806,1,0,0,0,804,805,5,25,0,0,805,807,3,118,59,0,806,804,1, + 0,0,0,806,807,1,0,0,0,807,808,1,0,0,0,808,809,5,26,0,0,809,941,1, + 0,0,0,810,811,5,13,0,0,811,812,5,133,0,0,812,813,3,118,59,0,813, + 814,5,6,0,0,814,815,3,114,57,0,815,816,5,152,0,0,816,941,1,0,0,0, + 817,818,5,20,0,0,818,941,5,113,0,0,819,820,5,48,0,0,820,821,3,118, + 59,0,821,822,3,150,75,0,822,941,1,0,0,0,823,824,5,85,0,0,824,825, + 5,133,0,0,825,826,3,118,59,0,826,827,5,35,0,0,827,830,3,118,59,0, + 828,829,5,34,0,0,829,831,3,118,59,0,830,828,1,0,0,0,830,831,1,0, + 0,0,831,832,1,0,0,0,832,833,5,152,0,0,833,941,1,0,0,0,834,835,5, + 89,0,0,835,941,5,113,0,0,836,837,5,94,0,0,837,838,5,133,0,0,838, + 839,7,10,0,0,839,840,3,164,82,0,840,841,5,35,0,0,841,842,3,118,59, + 0,842,843,5,152,0,0,843,941,1,0,0,0,844,845,3,158,79,0,845,847,5, + 133,0,0,846,848,3,116,58,0,847,846,1,0,0,0,847,848,1,0,0,0,848,849, + 1,0,0,0,849,850,5,152,0,0,850,859,1,0,0,0,851,853,5,133,0,0,852, + 854,5,24,0,0,853,852,1,0,0,0,853,854,1,0,0,0,854,856,1,0,0,0,855, + 857,3,116,58,0,856,855,1,0,0,0,856,857,1,0,0,0,857,858,1,0,0,0,858, + 860,5,152,0,0,859,851,1,0,0,0,859,860,1,0,0,0,860,861,1,0,0,0,861, + 862,5,69,0,0,862,863,5,133,0,0,863,864,3,100,50,0,864,865,5,152, + 0,0,865,941,1,0,0,0,866,867,3,158,79,0,867,869,5,133,0,0,868,870, + 3,116,58,0,869,868,1,0,0,0,869,870,1,0,0,0,870,871,1,0,0,0,871,872, + 5,152,0,0,872,881,1,0,0,0,873,875,5,133,0,0,874,876,5,24,0,0,875, + 874,1,0,0,0,875,876,1,0,0,0,876,878,1,0,0,0,877,879,3,116,58,0,878, + 877,1,0,0,0,878,879,1,0,0,0,879,880,1,0,0,0,880,882,5,152,0,0,881, + 873,1,0,0,0,881,882,1,0,0,0,882,883,1,0,0,0,883,884,5,69,0,0,884, + 885,3,158,79,0,885,941,1,0,0,0,886,892,3,158,79,0,887,889,5,133, + 0,0,888,890,3,116,58,0,889,888,1,0,0,0,889,890,1,0,0,0,890,891,1, + 0,0,0,891,893,5,152,0,0,892,887,1,0,0,0,892,893,1,0,0,0,893,894, + 1,0,0,0,894,896,5,133,0,0,895,897,5,24,0,0,896,895,1,0,0,0,896,897, + 1,0,0,0,897,899,1,0,0,0,898,900,3,116,58,0,899,898,1,0,0,0,899,900, + 1,0,0,0,900,901,1,0,0,0,901,902,5,152,0,0,902,941,1,0,0,0,903,941, + 3,122,61,0,904,941,3,166,83,0,905,941,3,148,74,0,906,907,5,121,0, + 0,907,941,3,118,59,20,908,909,5,61,0,0,909,941,3,118,59,14,910,911, + 3,138,69,0,911,912,5,123,0,0,912,914,1,0,0,0,913,910,1,0,0,0,913, + 914,1,0,0,0,914,915,1,0,0,0,915,941,5,115,0,0,916,917,5,133,0,0, + 917,918,3,48,24,0,918,919,5,152,0,0,919,941,1,0,0,0,920,921,5,133, + 0,0,921,922,3,118,59,0,922,923,5,152,0,0,923,941,1,0,0,0,924,925, + 5,133,0,0,925,926,3,116,58,0,926,927,5,152,0,0,927,941,1,0,0,0,928, + 930,5,132,0,0,929,931,3,116,58,0,930,929,1,0,0,0,930,931,1,0,0,0, + 931,932,1,0,0,0,932,941,5,151,0,0,933,935,5,131,0,0,934,936,3,40, + 20,0,935,934,1,0,0,0,935,936,1,0,0,0,936,937,1,0,0,0,937,941,5,150, + 0,0,938,941,3,120,60,0,939,941,3,130,65,0,940,790,1,0,0,0,940,810, + 1,0,0,0,940,817,1,0,0,0,940,819,1,0,0,0,940,823,1,0,0,0,940,834, + 1,0,0,0,940,836,1,0,0,0,940,844,1,0,0,0,940,866,1,0,0,0,940,886, + 1,0,0,0,940,903,1,0,0,0,940,904,1,0,0,0,940,905,1,0,0,0,940,906, + 1,0,0,0,940,908,1,0,0,0,940,913,1,0,0,0,940,916,1,0,0,0,940,920, + 1,0,0,0,940,924,1,0,0,0,940,928,1,0,0,0,940,933,1,0,0,0,940,938, + 1,0,0,0,940,939,1,0,0,0,941,1052,1,0,0,0,942,946,10,19,0,0,943,947, + 5,115,0,0,944,947,5,154,0,0,945,947,5,141,0,0,946,943,1,0,0,0,946, + 944,1,0,0,0,946,945,1,0,0,0,947,948,1,0,0,0,948,1051,3,118,59,20, + 949,953,10,18,0,0,950,954,5,142,0,0,951,954,5,121,0,0,952,954,5, + 120,0,0,953,950,1,0,0,0,953,951,1,0,0,0,953,952,1,0,0,0,954,955, + 1,0,0,0,955,1051,3,118,59,19,956,981,10,17,0,0,957,982,5,124,0,0, + 958,982,5,125,0,0,959,982,5,136,0,0,960,982,5,134,0,0,961,982,5, + 135,0,0,962,982,5,126,0,0,963,982,5,127,0,0,964,966,5,61,0,0,965, + 964,1,0,0,0,965,966,1,0,0,0,966,967,1,0,0,0,967,969,5,44,0,0,968, + 970,5,15,0,0,969,968,1,0,0,0,969,970,1,0,0,0,970,982,1,0,0,0,971, + 973,5,61,0,0,972,971,1,0,0,0,972,973,1,0,0,0,973,974,1,0,0,0,974, + 982,7,11,0,0,975,982,5,148,0,0,976,982,5,149,0,0,977,982,5,138,0, + 0,978,982,5,129,0,0,979,982,5,130,0,0,980,982,5,137,0,0,981,957, + 1,0,0,0,981,958,1,0,0,0,981,959,1,0,0,0,981,960,1,0,0,0,981,961, + 1,0,0,0,981,962,1,0,0,0,981,963,1,0,0,0,981,965,1,0,0,0,981,972, + 1,0,0,0,981,975,1,0,0,0,981,976,1,0,0,0,981,977,1,0,0,0,981,978, + 1,0,0,0,981,979,1,0,0,0,981,980,1,0,0,0,982,983,1,0,0,0,983,1051, + 3,118,59,18,984,985,10,15,0,0,985,986,5,140,0,0,986,1051,3,118,59, + 16,987,988,10,13,0,0,988,989,5,2,0,0,989,1051,3,118,59,14,990,991, + 10,12,0,0,991,992,5,66,0,0,992,1051,3,118,59,13,993,995,10,11,0, + 0,994,996,5,61,0,0,995,994,1,0,0,0,995,996,1,0,0,0,996,997,1,0,0, + 0,997,998,5,9,0,0,998,999,3,118,59,0,999,1000,5,2,0,0,1000,1001, + 3,118,59,12,1001,1051,1,0,0,0,1002,1003,10,10,0,0,1003,1004,5,143, + 0,0,1004,1005,3,118,59,0,1005,1006,5,118,0,0,1006,1007,3,118,59, + 10,1007,1051,1,0,0,0,1008,1009,10,30,0,0,1009,1011,5,133,0,0,1010, + 1012,3,116,58,0,1011,1010,1,0,0,0,1011,1012,1,0,0,0,1012,1013,1, + 0,0,0,1013,1051,5,152,0,0,1014,1015,10,26,0,0,1015,1016,5,132,0, + 0,1016,1017,3,118,59,0,1017,1018,5,151,0,0,1018,1051,1,0,0,0,1019, + 1020,10,25,0,0,1020,1021,5,123,0,0,1021,1051,5,111,0,0,1022,1023, + 10,24,0,0,1023,1024,5,123,0,0,1024,1051,3,158,79,0,1025,1026,10, + 23,0,0,1026,1027,5,139,0,0,1027,1028,5,132,0,0,1028,1029,3,118,59, + 0,1029,1030,5,151,0,0,1030,1051,1,0,0,0,1031,1032,10,22,0,0,1032, + 1033,5,139,0,0,1033,1051,5,111,0,0,1034,1035,10,21,0,0,1035,1036, + 5,139,0,0,1036,1051,3,158,79,0,1037,1038,10,16,0,0,1038,1040,5,49, + 0,0,1039,1041,5,61,0,0,1040,1039,1,0,0,0,1040,1041,1,0,0,0,1041, + 1042,1,0,0,0,1042,1051,5,62,0,0,1043,1048,10,9,0,0,1044,1045,5,6, + 0,0,1045,1049,3,158,79,0,1046,1047,5,6,0,0,1047,1049,5,113,0,0,1048, + 1044,1,0,0,0,1048,1046,1,0,0,0,1049,1051,1,0,0,0,1050,942,1,0,0, + 0,1050,949,1,0,0,0,1050,956,1,0,0,0,1050,984,1,0,0,0,1050,987,1, + 0,0,0,1050,990,1,0,0,0,1050,993,1,0,0,0,1050,1002,1,0,0,0,1050,1008, + 1,0,0,0,1050,1014,1,0,0,0,1050,1019,1,0,0,0,1050,1022,1,0,0,0,1050, + 1025,1,0,0,0,1050,1031,1,0,0,0,1050,1034,1,0,0,0,1050,1037,1,0,0, + 0,1050,1043,1,0,0,0,1051,1054,1,0,0,0,1052,1050,1,0,0,0,1052,1053, + 1,0,0,0,1053,119,1,0,0,0,1054,1052,1,0,0,0,1055,1056,5,133,0,0,1056, + 1061,3,158,79,0,1057,1058,5,119,0,0,1058,1060,3,158,79,0,1059,1057, + 1,0,0,0,1060,1063,1,0,0,0,1061,1059,1,0,0,0,1061,1062,1,0,0,0,1062, + 1065,1,0,0,0,1063,1061,1,0,0,0,1064,1066,5,119,0,0,1065,1064,1,0, + 0,0,1065,1066,1,0,0,0,1066,1067,1,0,0,0,1067,1068,5,152,0,0,1068, + 1083,1,0,0,0,1069,1074,3,158,79,0,1070,1071,5,119,0,0,1071,1073, + 3,158,79,0,1072,1070,1,0,0,0,1073,1076,1,0,0,0,1074,1072,1,0,0,0, + 1074,1075,1,0,0,0,1075,1078,1,0,0,0,1076,1074,1,0,0,0,1077,1079, + 5,119,0,0,1078,1077,1,0,0,0,1078,1079,1,0,0,0,1079,1083,1,0,0,0, + 1080,1081,5,133,0,0,1081,1083,5,152,0,0,1082,1055,1,0,0,0,1082,1069, + 1,0,0,0,1082,1080,1,0,0,0,1083,1084,1,0,0,0,1084,1087,5,114,0,0, + 1085,1088,3,118,59,0,1086,1088,3,36,18,0,1087,1085,1,0,0,0,1087, + 1086,1,0,0,0,1088,121,1,0,0,0,1089,1090,5,135,0,0,1090,1094,3,158, + 79,0,1091,1093,3,124,62,0,1092,1091,1,0,0,0,1093,1096,1,0,0,0,1094, + 1092,1,0,0,0,1094,1095,1,0,0,0,1095,1097,1,0,0,0,1096,1094,1,0,0, + 0,1097,1098,5,154,0,0,1098,1099,5,127,0,0,1099,1122,1,0,0,0,1100, + 1101,5,135,0,0,1101,1105,3,158,79,0,1102,1104,3,124,62,0,1103,1102, + 1,0,0,0,1104,1107,1,0,0,0,1105,1103,1,0,0,0,1105,1106,1,0,0,0,1106, + 1108,1,0,0,0,1107,1105,1,0,0,0,1108,1114,5,127,0,0,1109,1115,3,122, + 61,0,1110,1111,5,131,0,0,1111,1112,3,118,59,0,1112,1113,5,150,0, + 0,1113,1115,1,0,0,0,1114,1109,1,0,0,0,1114,1110,1,0,0,0,1114,1115, + 1,0,0,0,1115,1116,1,0,0,0,1116,1117,5,135,0,0,1117,1118,5,154,0, + 0,1118,1119,3,158,79,0,1119,1120,5,127,0,0,1120,1122,1,0,0,0,1121, + 1089,1,0,0,0,1121,1100,1,0,0,0,1122,123,1,0,0,0,1123,1124,3,158, + 79,0,1124,1125,5,125,0,0,1125,1126,3,164,82,0,1126,1135,1,0,0,0, + 1127,1128,3,158,79,0,1128,1129,5,125,0,0,1129,1130,5,131,0,0,1130, + 1131,3,118,59,0,1131,1132,5,150,0,0,1132,1135,1,0,0,0,1133,1135, + 3,158,79,0,1134,1123,1,0,0,0,1134,1127,1,0,0,0,1134,1133,1,0,0,0, + 1135,125,1,0,0,0,1136,1141,3,128,64,0,1137,1138,5,119,0,0,1138,1140, + 3,128,64,0,1139,1137,1,0,0,0,1140,1143,1,0,0,0,1141,1139,1,0,0,0, + 1141,1142,1,0,0,0,1142,1145,1,0,0,0,1143,1141,1,0,0,0,1144,1146, + 5,119,0,0,1145,1144,1,0,0,0,1145,1146,1,0,0,0,1146,127,1,0,0,0,1147, + 1148,3,158,79,0,1148,1149,5,6,0,0,1149,1150,5,133,0,0,1150,1151, + 3,48,24,0,1151,1152,5,152,0,0,1152,1158,1,0,0,0,1153,1154,3,118, + 59,0,1154,1155,5,6,0,0,1155,1156,3,158,79,0,1156,1158,1,0,0,0,1157, + 1147,1,0,0,0,1157,1153,1,0,0,0,1158,129,1,0,0,0,1159,1167,3,162, + 81,0,1160,1161,3,138,69,0,1161,1162,5,123,0,0,1162,1164,1,0,0,0, + 1163,1160,1,0,0,0,1163,1164,1,0,0,0,1164,1165,1,0,0,0,1165,1167, + 3,132,66,0,1166,1159,1,0,0,0,1166,1163,1,0,0,0,1167,131,1,0,0,0, + 1168,1173,3,158,79,0,1169,1170,5,123,0,0,1170,1172,3,158,79,0,1171, + 1169,1,0,0,0,1172,1175,1,0,0,0,1173,1171,1,0,0,0,1173,1174,1,0,0, + 0,1174,133,1,0,0,0,1175,1173,1,0,0,0,1176,1177,6,67,-1,0,1177,1186, + 3,138,69,0,1178,1186,3,136,68,0,1179,1180,5,133,0,0,1180,1181,3, + 48,24,0,1181,1182,5,152,0,0,1182,1186,1,0,0,0,1183,1186,3,122,61, + 0,1184,1186,3,162,81,0,1185,1176,1,0,0,0,1185,1178,1,0,0,0,1185, + 1179,1,0,0,0,1185,1183,1,0,0,0,1185,1184,1,0,0,0,1186,1195,1,0,0, + 0,1187,1191,10,3,0,0,1188,1192,3,156,78,0,1189,1190,5,6,0,0,1190, + 1192,3,158,79,0,1191,1188,1,0,0,0,1191,1189,1,0,0,0,1192,1194,1, + 0,0,0,1193,1187,1,0,0,0,1194,1197,1,0,0,0,1195,1193,1,0,0,0,1195, + 1196,1,0,0,0,1196,135,1,0,0,0,1197,1195,1,0,0,0,1198,1199,3,158, + 79,0,1199,1201,5,133,0,0,1200,1202,3,140,70,0,1201,1200,1,0,0,0, + 1201,1202,1,0,0,0,1202,1203,1,0,0,0,1203,1204,5,152,0,0,1204,137, + 1,0,0,0,1205,1206,3,142,71,0,1206,1207,5,123,0,0,1207,1209,1,0,0, + 0,1208,1205,1,0,0,0,1208,1209,1,0,0,0,1209,1210,1,0,0,0,1210,1211, + 3,158,79,0,1211,139,1,0,0,0,1212,1217,3,118,59,0,1213,1214,5,119, + 0,0,1214,1216,3,118,59,0,1215,1213,1,0,0,0,1216,1219,1,0,0,0,1217, + 1215,1,0,0,0,1217,1218,1,0,0,0,1218,1221,1,0,0,0,1219,1217,1,0,0, + 0,1220,1222,5,119,0,0,1221,1220,1,0,0,0,1221,1222,1,0,0,0,1222,141, + 1,0,0,0,1223,1224,3,158,79,0,1224,143,1,0,0,0,1225,1234,5,109,0, + 0,1226,1227,5,123,0,0,1227,1234,7,12,0,0,1228,1229,5,111,0,0,1229, + 1231,5,123,0,0,1230,1232,7,12,0,0,1231,1230,1,0,0,0,1231,1232,1, + 0,0,0,1232,1234,1,0,0,0,1233,1225,1,0,0,0,1233,1226,1,0,0,0,1233, + 1228,1,0,0,0,1234,145,1,0,0,0,1235,1237,7,13,0,0,1236,1235,1,0,0, + 0,1236,1237,1,0,0,0,1237,1244,1,0,0,0,1238,1245,3,144,72,0,1239, + 1245,5,110,0,0,1240,1245,5,111,0,0,1241,1245,5,112,0,0,1242,1245, + 5,45,0,0,1243,1245,5,60,0,0,1244,1238,1,0,0,0,1244,1239,1,0,0,0, + 1244,1240,1,0,0,0,1244,1241,1,0,0,0,1244,1242,1,0,0,0,1244,1243, + 1,0,0,0,1245,147,1,0,0,0,1246,1250,3,146,73,0,1247,1250,5,113,0, + 0,1248,1250,5,62,0,0,1249,1246,1,0,0,0,1249,1247,1,0,0,0,1249,1248, + 1,0,0,0,1250,149,1,0,0,0,1251,1252,7,14,0,0,1252,151,1,0,0,0,1253, + 1254,7,15,0,0,1254,153,1,0,0,0,1255,1256,7,16,0,0,1256,155,1,0,0, + 0,1257,1260,5,108,0,0,1258,1260,3,154,77,0,1259,1257,1,0,0,0,1259, + 1258,1,0,0,0,1260,157,1,0,0,0,1261,1265,5,108,0,0,1262,1265,3,150, + 75,0,1263,1265,3,152,76,0,1264,1261,1,0,0,0,1264,1262,1,0,0,0,1264, + 1263,1,0,0,0,1265,159,1,0,0,0,1266,1267,3,164,82,0,1267,1268,5,125, + 0,0,1268,1269,3,146,73,0,1269,161,1,0,0,0,1270,1271,5,131,0,0,1271, + 1272,3,118,59,0,1272,1273,5,150,0,0,1273,163,1,0,0,0,1274,1277,5, + 113,0,0,1275,1277,3,166,83,0,1276,1274,1,0,0,0,1276,1275,1,0,0,0, + 1277,165,1,0,0,0,1278,1282,5,145,0,0,1279,1281,3,168,84,0,1280,1279, + 1,0,0,0,1281,1284,1,0,0,0,1282,1280,1,0,0,0,1282,1283,1,0,0,0,1283, + 1285,1,0,0,0,1284,1282,1,0,0,0,1285,1286,5,147,0,0,1286,167,1,0, + 0,0,1287,1288,5,160,0,0,1288,1289,3,118,59,0,1289,1290,5,150,0,0, + 1290,1293,1,0,0,0,1291,1293,5,159,0,0,1292,1287,1,0,0,0,1292,1291, + 1,0,0,0,1293,169,1,0,0,0,1294,1298,5,146,0,0,1295,1297,3,172,86, + 0,1296,1295,1,0,0,0,1297,1300,1,0,0,0,1298,1296,1,0,0,0,1298,1299, + 1,0,0,0,1299,1301,1,0,0,0,1300,1298,1,0,0,0,1301,1302,5,0,0,1,1302, + 171,1,0,0,0,1303,1304,5,162,0,0,1304,1305,3,118,59,0,1305,1306,5, + 150,0,0,1306,1309,1,0,0,0,1307,1309,5,161,0,0,1308,1303,1,0,0,0, + 1308,1307,1,0,0,0,1309,173,1,0,0,0,168,177,184,193,200,204,218,222, + 225,229,232,239,243,252,257,266,274,281,285,291,296,304,311,317, + 329,337,351,355,360,370,376,384,388,392,395,399,402,405,408,411, + 415,419,422,425,428,432,435,444,450,471,488,505,511,517,528,530, + 541,544,550,558,564,566,570,575,578,581,585,589,592,594,597,601, + 605,608,610,612,617,628,634,641,646,650,654,660,662,669,677,680, + 683,702,716,732,736,747,751,762,766,773,777,784,788,793,802,806, + 830,847,853,856,859,869,875,878,881,889,892,896,899,913,930,935, + 940,946,953,965,969,972,981,995,1011,1040,1048,1050,1052,1061,1065, + 1074,1078,1082,1087,1094,1105,1114,1121,1134,1141,1145,1157,1163, + 1166,1173,1185,1191,1195,1201,1208,1217,1221,1231,1233,1236,1244, + 1249,1259,1264,1276,1282,1292,1298,1308 ] class HogQLParser ( Parser ): @@ -576,44 +579,46 @@ class HogQLParser ( Parser ): "", "", "", "", "", "", "", "", "", "", "", "", - "'->'", "'*'", "'`'", "'\\'", "':'", "','", "'||'", - "'-'", "'$'", "'.'", "'=='", "'='", "'>='", "'>'", - "'#'", "'~*'", "'=~*'", "'{'", "'['", "'('", "'<='", - "'<'", "", "'!~*'", "'!~'", "'?.'", "'??'", - "'%'", "'+'", "'?'", "'\"'", "'f''", "'F''", "'''", - "'~'", "'=~'", "'}'", "']'", "')'", "';'", "'/'", "'_'" ] + "", "", "'->'", "'*'", "'`'", "'\\'", + "':'", "','", "'||'", "'-'", "'$'", "'.'", "'=='", + "'='", "'>='", "'>'", "'#'", "'~*'", "'=~*'", "'{'", + "'['", "'('", "'<='", "'<'", "", "'!~*'", + "'!~'", "'?.'", "'??'", "'%'", "'+'", "'?'", "'\"'", + "'f''", "'F''", "'''", "'~'", "'=~'", "'}'", "']'", + "')'", "';'", "'/'", "'_'" ] symbolicNames = [ "", "ALL", "AND", "ANTI", "ANY", "ARRAY", "AS", "ASCENDING", "ASOF", "BETWEEN", "BOTH", "BY", "CASE", "CAST", "CATCH", "COHORT", "COLLATE", "CROSS", "CUBE", "CURRENT", "DATE", "DAY", "DESC", "DESCENDING", - "DISTINCT", "ELSE", "END", "EXTRACT", "FINAL", "FINALLY", - "FIRST", "FN", "FOLLOWING", "FOR", "FROM", "FULL", - "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", "ILIKE", - "IN", "INF", "INNER", "INTERVAL", "IS", "JOIN", "KEY", - "LAST", "LEADING", "LEFT", "LET", "LIKE", "LIMIT", - "MINUTE", "MONTH", "NAN_SQL", "NOT", "NULL_SQL", "NULLS", - "OFFSET", "ON", "OR", "ORDER", "OUTER", "OVER", "PARTITION", - "PRECEDING", "PREWHERE", "QUARTER", "RANGE", "RETURN", - "RIGHT", "ROLLUP", "ROW", "ROWS", "SAMPLE", "SECOND", - "SELECT", "SEMI", "SETTINGS", "SUBSTRING", "THEN", - "THROW", "TIES", "TIMESTAMP", "TO", "TOP", "TOTALS", - "TRAILING", "TRIM", "TRUNCATE", "TRY", "UNBOUNDED", - "UNION", "USING", "WEEK", "WHEN", "WHERE", "WHILE", - "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", "IDENTIFIER", - "FLOATING_LITERAL", "OCTAL_LITERAL", "DECIMAL_LITERAL", - "HEXADECIMAL_LITERAL", "STRING_LITERAL", "ARROW", - "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", "COMMA", - "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", "EQ_SINGLE", - "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", "IREGEX_DOUBLE", - "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", "LT", "NOT_EQ", - "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", "NULLISH", - "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", "QUOTE_SINGLE_TEMPLATE", - "QUOTE_SINGLE_TEMPLATE_FULL", "QUOTE_SINGLE", "REGEX_SINGLE", - "REGEX_DOUBLE", "RBRACE", "RBRACKET", "RPAREN", "SEMICOLON", - "SLASH", "UNDERSCORE", "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", - "WHITESPACE", "STRING_TEXT", "STRING_ESCAPE_TRIGGER", - "FULL_STRING_TEXT", "FULL_STRING_ESCAPE_TRIGGER" ] + "DISTINCT", "ELSE", "END", "EXCEPT", "EXTRACT", "FINAL", + "FINALLY", "FIRST", "FN", "FOLLOWING", "FOR", "FROM", + "FULL", "FUN", "GROUP", "HAVING", "HOUR", "ID", "IF", + "ILIKE", "IN", "INF", "INNER", "INTERSECT", "INTERVAL", + "IS", "JOIN", "KEY", "LAST", "LEADING", "LEFT", "LET", + "LIKE", "LIMIT", "MINUTE", "MONTH", "NAN_SQL", "NOT", + "NULL_SQL", "NULLS", "OFFSET", "ON", "OR", "ORDER", + "OUTER", "OVER", "PARTITION", "PRECEDING", "PREWHERE", + "QUARTER", "RANGE", "RETURN", "RIGHT", "ROLLUP", "ROW", + "ROWS", "SAMPLE", "SECOND", "SELECT", "SEMI", "SETTINGS", + "SUBSTRING", "THEN", "THROW", "TIES", "TIMESTAMP", + "TO", "TOP", "TOTALS", "TRAILING", "TRIM", "TRUNCATE", + "TRY", "UNBOUNDED", "UNION", "USING", "WEEK", "WHEN", + "WHERE", "WHILE", "WINDOW", "WITH", "YEAR", "ESCAPE_CHAR_COMMON", + "IDENTIFIER", "FLOATING_LITERAL", "OCTAL_LITERAL", + "DECIMAL_LITERAL", "HEXADECIMAL_LITERAL", "STRING_LITERAL", + "ARROW", "ASTERISK", "BACKQUOTE", "BACKSLASH", "COLON", + "COMMA", "CONCAT", "DASH", "DOLLAR", "DOT", "EQ_DOUBLE", + "EQ_SINGLE", "GT_EQ", "GT", "HASH", "IREGEX_SINGLE", + "IREGEX_DOUBLE", "LBRACE", "LBRACKET", "LPAREN", "LT_EQ", + "LT", "NOT_EQ", "NOT_IREGEX", "NOT_REGEX", "NULL_PROPERTY", + "NULLISH", "PERCENT", "PLUS", "QUERY", "QUOTE_DOUBLE", + "QUOTE_SINGLE_TEMPLATE", "QUOTE_SINGLE_TEMPLATE_FULL", + "QUOTE_SINGLE", "REGEX_SINGLE", "REGEX_DOUBLE", "RBRACE", + "RBRACKET", "RPAREN", "SEMICOLON", "SLASH", "UNDERSCORE", + "MULTI_LINE_COMMENT", "SINGLE_LINE_COMMENT", "WHITESPACE", + "STRING_TEXT", "STRING_ESCAPE_TRIGGER", "FULL_STRING_TEXT", + "FULL_STRING_ESCAPE_TRIGGER" ] RULE_program = 0 RULE_declaration = 1 @@ -637,94 +642,95 @@ class HogQLParser ( Parser ): RULE_kvPair = 19 RULE_kvPairList = 20 RULE_select = 21 - RULE_selectUnionStmt = 22 - RULE_selectStmtWithParens = 23 - RULE_selectStmt = 24 - RULE_withClause = 25 - RULE_topClause = 26 - RULE_fromClause = 27 - RULE_arrayJoinClause = 28 - RULE_windowClause = 29 - RULE_prewhereClause = 30 - RULE_whereClause = 31 - RULE_groupByClause = 32 - RULE_havingClause = 33 - RULE_orderByClause = 34 - RULE_projectionOrderByClause = 35 - RULE_limitAndOffsetClause = 36 - RULE_offsetOnlyClause = 37 - RULE_settingsClause = 38 - RULE_joinExpr = 39 - RULE_joinOp = 40 - RULE_joinOpCross = 41 - RULE_joinConstraintClause = 42 - RULE_sampleClause = 43 - RULE_orderExprList = 44 - RULE_orderExpr = 45 - RULE_ratioExpr = 46 - RULE_settingExprList = 47 - RULE_settingExpr = 48 - RULE_windowExpr = 49 - RULE_winPartitionByClause = 50 - RULE_winOrderByClause = 51 - RULE_winFrameClause = 52 - RULE_winFrameExtend = 53 - RULE_winFrameBound = 54 - RULE_expr = 55 - RULE_columnTypeExpr = 56 - RULE_columnExprList = 57 - RULE_columnExpr = 58 - RULE_columnLambdaExpr = 59 - RULE_hogqlxTagElement = 60 - RULE_hogqlxTagAttribute = 61 - RULE_withExprList = 62 - RULE_withExpr = 63 - RULE_columnIdentifier = 64 - RULE_nestedIdentifier = 65 - RULE_tableExpr = 66 - RULE_tableFunctionExpr = 67 - RULE_tableIdentifier = 68 - RULE_tableArgList = 69 - RULE_databaseIdentifier = 70 - RULE_floatingLiteral = 71 - RULE_numberLiteral = 72 - RULE_literal = 73 - RULE_interval = 74 - RULE_keyword = 75 - RULE_keywordForAlias = 76 - RULE_alias = 77 - RULE_identifier = 78 - RULE_enumValue = 79 - RULE_placeholder = 80 - RULE_string = 81 - RULE_templateString = 82 - RULE_stringContents = 83 - RULE_fullTemplateString = 84 - RULE_stringContentsFull = 85 + RULE_selectStmtWithParens = 22 + RULE_subsequentSelectSetClause = 23 + RULE_selectSetStmt = 24 + RULE_selectStmt = 25 + RULE_withClause = 26 + RULE_topClause = 27 + RULE_fromClause = 28 + RULE_arrayJoinClause = 29 + RULE_windowClause = 30 + RULE_prewhereClause = 31 + RULE_whereClause = 32 + RULE_groupByClause = 33 + RULE_havingClause = 34 + RULE_orderByClause = 35 + RULE_projectionOrderByClause = 36 + RULE_limitAndOffsetClause = 37 + RULE_offsetOnlyClause = 38 + RULE_settingsClause = 39 + RULE_joinExpr = 40 + RULE_joinOp = 41 + RULE_joinOpCross = 42 + RULE_joinConstraintClause = 43 + RULE_sampleClause = 44 + RULE_orderExprList = 45 + RULE_orderExpr = 46 + RULE_ratioExpr = 47 + RULE_settingExprList = 48 + RULE_settingExpr = 49 + RULE_windowExpr = 50 + RULE_winPartitionByClause = 51 + RULE_winOrderByClause = 52 + RULE_winFrameClause = 53 + RULE_winFrameExtend = 54 + RULE_winFrameBound = 55 + RULE_expr = 56 + RULE_columnTypeExpr = 57 + RULE_columnExprList = 58 + RULE_columnExpr = 59 + RULE_columnLambdaExpr = 60 + RULE_hogqlxTagElement = 61 + RULE_hogqlxTagAttribute = 62 + RULE_withExprList = 63 + RULE_withExpr = 64 + RULE_columnIdentifier = 65 + RULE_nestedIdentifier = 66 + RULE_tableExpr = 67 + RULE_tableFunctionExpr = 68 + RULE_tableIdentifier = 69 + RULE_tableArgList = 70 + RULE_databaseIdentifier = 71 + RULE_floatingLiteral = 72 + RULE_numberLiteral = 73 + RULE_literal = 74 + RULE_interval = 75 + RULE_keyword = 76 + RULE_keywordForAlias = 77 + RULE_alias = 78 + RULE_identifier = 79 + RULE_enumValue = 80 + RULE_placeholder = 81 + RULE_string = 82 + RULE_templateString = 83 + RULE_stringContents = 84 + RULE_fullTemplateString = 85 + RULE_stringContentsFull = 86 ruleNames = [ "program", "declaration", "expression", "varDecl", "identifierList", "statement", "returnStmt", "throwStmt", "catchBlock", "tryCatchStmt", "ifStmt", "whileStmt", "forStmt", "forInStmt", "funcStmt", "varAssignment", "exprStmt", "emptyStmt", - "block", "kvPair", "kvPairList", "select", "selectUnionStmt", - "selectStmtWithParens", "selectStmt", "withClause", "topClause", - "fromClause", "arrayJoinClause", "windowClause", "prewhereClause", - "whereClause", "groupByClause", "havingClause", "orderByClause", - "projectionOrderByClause", "limitAndOffsetClause", "offsetOnlyClause", - "settingsClause", "joinExpr", "joinOp", "joinOpCross", - "joinConstraintClause", "sampleClause", "orderExprList", - "orderExpr", "ratioExpr", "settingExprList", "settingExpr", - "windowExpr", "winPartitionByClause", "winOrderByClause", - "winFrameClause", "winFrameExtend", "winFrameBound", - "expr", "columnTypeExpr", "columnExprList", "columnExpr", - "columnLambdaExpr", "hogqlxTagElement", "hogqlxTagAttribute", - "withExprList", "withExpr", "columnIdentifier", "nestedIdentifier", - "tableExpr", "tableFunctionExpr", "tableIdentifier", - "tableArgList", "databaseIdentifier", "floatingLiteral", - "numberLiteral", "literal", "interval", "keyword", "keywordForAlias", - "alias", "identifier", "enumValue", "placeholder", "string", - "templateString", "stringContents", "fullTemplateString", - "stringContentsFull" ] + "block", "kvPair", "kvPairList", "select", "selectStmtWithParens", + "subsequentSelectSetClause", "selectSetStmt", "selectStmt", + "withClause", "topClause", "fromClause", "arrayJoinClause", + "windowClause", "prewhereClause", "whereClause", "groupByClause", + "havingClause", "orderByClause", "projectionOrderByClause", + "limitAndOffsetClause", "offsetOnlyClause", "settingsClause", + "joinExpr", "joinOp", "joinOpCross", "joinConstraintClause", + "sampleClause", "orderExprList", "orderExpr", "ratioExpr", + "settingExprList", "settingExpr", "windowExpr", "winPartitionByClause", + "winOrderByClause", "winFrameClause", "winFrameExtend", + "winFrameBound", "expr", "columnTypeExpr", "columnExprList", + "columnExpr", "columnLambdaExpr", "hogqlxTagElement", + "hogqlxTagAttribute", "withExprList", "withExpr", "columnIdentifier", + "nestedIdentifier", "tableExpr", "tableFunctionExpr", + "tableIdentifier", "tableArgList", "databaseIdentifier", + "floatingLiteral", "numberLiteral", "literal", "interval", + "keyword", "keywordForAlias", "alias", "identifier", + "enumValue", "placeholder", "string", "templateString", + "stringContents", "fullTemplateString", "stringContentsFull" ] EOF = Token.EOF ALL=1 @@ -753,140 +759,142 @@ class HogQLParser ( Parser ): DISTINCT=24 ELSE=25 END=26 - EXTRACT=27 - FINAL=28 - FINALLY=29 - FIRST=30 - FN=31 - FOLLOWING=32 - FOR=33 - FROM=34 - FULL=35 - FUN=36 - GROUP=37 - HAVING=38 - HOUR=39 - ID=40 - IF=41 - ILIKE=42 - IN=43 - INF=44 - INNER=45 - INTERVAL=46 - IS=47 - JOIN=48 - KEY=49 - LAST=50 - LEADING=51 - LEFT=52 - LET=53 - LIKE=54 - LIMIT=55 - MINUTE=56 - MONTH=57 - NAN_SQL=58 - NOT=59 - NULL_SQL=60 - NULLS=61 - OFFSET=62 - ON=63 - OR=64 - ORDER=65 - OUTER=66 - OVER=67 - PARTITION=68 - PRECEDING=69 - PREWHERE=70 - QUARTER=71 - RANGE=72 - RETURN=73 - RIGHT=74 - ROLLUP=75 - ROW=76 - ROWS=77 - SAMPLE=78 - SECOND=79 - SELECT=80 - SEMI=81 - SETTINGS=82 - SUBSTRING=83 - THEN=84 - THROW=85 - TIES=86 - TIMESTAMP=87 - TO=88 - TOP=89 - TOTALS=90 - TRAILING=91 - TRIM=92 - TRUNCATE=93 - TRY=94 - UNBOUNDED=95 - UNION=96 - USING=97 - WEEK=98 - WHEN=99 - WHERE=100 - WHILE=101 - WINDOW=102 - WITH=103 - YEAR=104 - ESCAPE_CHAR_COMMON=105 - IDENTIFIER=106 - FLOATING_LITERAL=107 - OCTAL_LITERAL=108 - DECIMAL_LITERAL=109 - HEXADECIMAL_LITERAL=110 - STRING_LITERAL=111 - ARROW=112 - ASTERISK=113 - BACKQUOTE=114 - BACKSLASH=115 - COLON=116 - COMMA=117 - CONCAT=118 - DASH=119 - DOLLAR=120 - DOT=121 - EQ_DOUBLE=122 - EQ_SINGLE=123 - GT_EQ=124 - GT=125 - HASH=126 - IREGEX_SINGLE=127 - IREGEX_DOUBLE=128 - LBRACE=129 - LBRACKET=130 - LPAREN=131 - LT_EQ=132 - LT=133 - NOT_EQ=134 - NOT_IREGEX=135 - NOT_REGEX=136 - NULL_PROPERTY=137 - NULLISH=138 - PERCENT=139 - PLUS=140 - QUERY=141 - QUOTE_DOUBLE=142 - QUOTE_SINGLE_TEMPLATE=143 - QUOTE_SINGLE_TEMPLATE_FULL=144 - QUOTE_SINGLE=145 - REGEX_SINGLE=146 - REGEX_DOUBLE=147 - RBRACE=148 - RBRACKET=149 - RPAREN=150 - SEMICOLON=151 - SLASH=152 - UNDERSCORE=153 - MULTI_LINE_COMMENT=154 - SINGLE_LINE_COMMENT=155 - WHITESPACE=156 - STRING_TEXT=157 - STRING_ESCAPE_TRIGGER=158 - FULL_STRING_TEXT=159 - FULL_STRING_ESCAPE_TRIGGER=160 + EXCEPT=27 + EXTRACT=28 + FINAL=29 + FINALLY=30 + FIRST=31 + FN=32 + FOLLOWING=33 + FOR=34 + FROM=35 + FULL=36 + FUN=37 + GROUP=38 + HAVING=39 + HOUR=40 + ID=41 + IF=42 + ILIKE=43 + IN=44 + INF=45 + INNER=46 + INTERSECT=47 + INTERVAL=48 + IS=49 + JOIN=50 + KEY=51 + LAST=52 + LEADING=53 + LEFT=54 + LET=55 + LIKE=56 + LIMIT=57 + MINUTE=58 + MONTH=59 + NAN_SQL=60 + NOT=61 + NULL_SQL=62 + NULLS=63 + OFFSET=64 + ON=65 + OR=66 + ORDER=67 + OUTER=68 + OVER=69 + PARTITION=70 + PRECEDING=71 + PREWHERE=72 + QUARTER=73 + RANGE=74 + RETURN=75 + RIGHT=76 + ROLLUP=77 + ROW=78 + ROWS=79 + SAMPLE=80 + SECOND=81 + SELECT=82 + SEMI=83 + SETTINGS=84 + SUBSTRING=85 + THEN=86 + THROW=87 + TIES=88 + TIMESTAMP=89 + TO=90 + TOP=91 + TOTALS=92 + TRAILING=93 + TRIM=94 + TRUNCATE=95 + TRY=96 + UNBOUNDED=97 + UNION=98 + USING=99 + WEEK=100 + WHEN=101 + WHERE=102 + WHILE=103 + WINDOW=104 + WITH=105 + YEAR=106 + ESCAPE_CHAR_COMMON=107 + IDENTIFIER=108 + FLOATING_LITERAL=109 + OCTAL_LITERAL=110 + DECIMAL_LITERAL=111 + HEXADECIMAL_LITERAL=112 + STRING_LITERAL=113 + ARROW=114 + ASTERISK=115 + BACKQUOTE=116 + BACKSLASH=117 + COLON=118 + COMMA=119 + CONCAT=120 + DASH=121 + DOLLAR=122 + DOT=123 + EQ_DOUBLE=124 + EQ_SINGLE=125 + GT_EQ=126 + GT=127 + HASH=128 + IREGEX_SINGLE=129 + IREGEX_DOUBLE=130 + LBRACE=131 + LBRACKET=132 + LPAREN=133 + LT_EQ=134 + LT=135 + NOT_EQ=136 + NOT_IREGEX=137 + NOT_REGEX=138 + NULL_PROPERTY=139 + NULLISH=140 + PERCENT=141 + PLUS=142 + QUERY=143 + QUOTE_DOUBLE=144 + QUOTE_SINGLE_TEMPLATE=145 + QUOTE_SINGLE_TEMPLATE_FULL=146 + QUOTE_SINGLE=147 + REGEX_SINGLE=148 + REGEX_DOUBLE=149 + RBRACE=150 + RBRACKET=151 + RPAREN=152 + SEMICOLON=153 + SLASH=154 + UNDERSCORE=155 + MULTI_LINE_COMMENT=156 + SINGLE_LINE_COMMENT=157 + WHITESPACE=158 + STRING_TEXT=159 + STRING_ESCAPE_TRIGGER=160 + FULL_STRING_TEXT=161 + FULL_STRING_ESCAPE_TRIGGER=162 def __init__(self, input:TokenStream, output:TextIO = sys.stdout): super().__init__(input, output) @@ -933,17 +941,17 @@ def program(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 175 + self.state = 177 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -536887298) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986211001696255) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 4212759) != 0): - self.state = 172 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -140738696331266) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944844006785023) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 4212759) != 0): + self.state = 174 self.declaration() - self.state = 177 + self.state = 179 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 178 + self.state = 180 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -986,17 +994,17 @@ def declaration(self): localctx = HogQLParser.DeclarationContext(self, self._ctx, self.state) self.enterRule(localctx, 2, self.RULE_declaration) try: - self.state = 182 + self.state = 184 self._errHandler.sync(self) token = self._input.LA(1) - if token in [53]: + if token in [55]: self.enterOuterAlt(localctx, 1) - self.state = 180 + self.state = 182 self.varDecl() pass - elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 106, 107, 108, 109, 110, 111, 113, 119, 121, 129, 130, 131, 133, 140, 143, 151]: + elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 108, 109, 110, 111, 112, 113, 115, 121, 123, 131, 132, 133, 135, 142, 145, 153]: self.enterOuterAlt(localctx, 2) - self.state = 181 + self.state = 183 self.statement() pass else: @@ -1040,7 +1048,7 @@ def expression(self): self.enterRule(localctx, 4, self.RULE_expression) try: self.enterOuterAlt(localctx, 1) - self.state = 184 + self.state = 186 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -1094,19 +1102,19 @@ def varDecl(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 186 + self.state = 188 self.match(HogQLParser.LET) - self.state = 187 + self.state = 189 self.identifier() - self.state = 191 + self.state = 193 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==116: - self.state = 188 + if _la==118: + self.state = 190 self.match(HogQLParser.COLON) - self.state = 189 + self.state = 191 self.match(HogQLParser.EQ_SINGLE) - self.state = 190 + self.state = 192 self.expression() @@ -1158,26 +1166,26 @@ def identifierList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 193 + self.state = 195 self.identifier() - self.state = 198 + self.state = 200 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,3,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 194 + self.state = 196 self.match(HogQLParser.COMMA) - self.state = 195 + self.state = 197 self.identifier() - self.state = 200 + self.state = 202 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,3,self._ctx) - self.state = 202 + self.state = 204 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 201 + if _la==119: + self.state = 203 self.match(HogQLParser.COMMA) @@ -1262,78 +1270,78 @@ def statement(self): localctx = HogQLParser.StatementContext(self, self._ctx, self.state) self.enterRule(localctx, 10, self.RULE_statement) try: - self.state = 216 + self.state = 218 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,5,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 204 + self.state = 206 self.returnStmt() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 205 + self.state = 207 self.throwStmt() pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 206 + self.state = 208 self.tryCatchStmt() pass elif la_ == 4: self.enterOuterAlt(localctx, 4) - self.state = 207 + self.state = 209 self.ifStmt() pass elif la_ == 5: self.enterOuterAlt(localctx, 5) - self.state = 208 + self.state = 210 self.whileStmt() pass elif la_ == 6: self.enterOuterAlt(localctx, 6) - self.state = 209 + self.state = 211 self.forInStmt() pass elif la_ == 7: self.enterOuterAlt(localctx, 7) - self.state = 210 + self.state = 212 self.forStmt() pass elif la_ == 8: self.enterOuterAlt(localctx, 8) - self.state = 211 + self.state = 213 self.funcStmt() pass elif la_ == 9: self.enterOuterAlt(localctx, 9) - self.state = 212 + self.state = 214 self.varAssignment() pass elif la_ == 10: self.enterOuterAlt(localctx, 10) - self.state = 213 + self.state = 215 self.block() pass elif la_ == 11: self.enterOuterAlt(localctx, 11) - self.state = 214 + self.state = 216 self.exprStmt() pass elif la_ == 12: self.enterOuterAlt(localctx, 12) - self.state = 215 + self.state = 217 self.emptyStmt() pass @@ -1382,21 +1390,21 @@ def returnStmt(self): self.enterRule(localctx, 12, self.RULE_returnStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 218 - self.match(HogQLParser.RETURN) self.state = 220 + self.match(HogQLParser.RETURN) + self.state = 222 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,6,self._ctx) if la_ == 1: - self.state = 219 + self.state = 221 self.expression() - self.state = 223 + self.state = 225 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,7,self._ctx) if la_ == 1: - self.state = 222 + self.state = 224 self.match(HogQLParser.SEMICOLON) @@ -1444,21 +1452,21 @@ def throwStmt(self): self.enterRule(localctx, 14, self.RULE_throwStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 225 - self.match(HogQLParser.THROW) self.state = 227 + self.match(HogQLParser.THROW) + self.state = 229 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,8,self._ctx) if la_ == 1: - self.state = 226 + self.state = 228 self.expression() - self.state = 230 + self.state = 232 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,9,self._ctx) if la_ == 1: - self.state = 229 + self.state = 231 self.match(HogQLParser.SEMICOLON) @@ -1523,31 +1531,31 @@ def catchBlock(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 232 + self.state = 234 self.match(HogQLParser.CATCH) - self.state = 241 + self.state = 243 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==131: - self.state = 233 + if _la==133: + self.state = 235 self.match(HogQLParser.LPAREN) - self.state = 234 + self.state = 236 localctx.catchVar = self.identifier() - self.state = 237 + self.state = 239 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==116: - self.state = 235 + if _la==118: + self.state = 237 self.match(HogQLParser.COLON) - self.state = 236 + self.state = 238 localctx.catchType = self.identifier() - self.state = 239 + self.state = 241 self.match(HogQLParser.RPAREN) - self.state = 243 + self.state = 245 localctx.catchStmt = self.block() except RecognitionException as re: localctx.exception = re @@ -1606,27 +1614,27 @@ def tryCatchStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 245 + self.state = 247 self.match(HogQLParser.TRY) - self.state = 246 + self.state = 248 localctx.tryStmt = self.block() - self.state = 250 + self.state = 252 self._errHandler.sync(self) _la = self._input.LA(1) while _la==14: - self.state = 247 + self.state = 249 self.catchBlock() - self.state = 252 + self.state = 254 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 255 + self.state = 257 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==29: - self.state = 253 + if _la==30: + self.state = 255 self.match(HogQLParser.FINALLY) - self.state = 254 + self.state = 256 localctx.finallyStmt = self.block() @@ -1687,23 +1695,23 @@ def ifStmt(self): self.enterRule(localctx, 20, self.RULE_ifStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 257 + self.state = 259 self.match(HogQLParser.IF) - self.state = 258 + self.state = 260 self.match(HogQLParser.LPAREN) - self.state = 259 + self.state = 261 self.expression() - self.state = 260 + self.state = 262 self.match(HogQLParser.RPAREN) - self.state = 261 + self.state = 263 self.statement() - self.state = 264 + self.state = 266 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,14,self._ctx) if la_ == 1: - self.state = 262 + self.state = 264 self.match(HogQLParser.ELSE) - self.state = 263 + self.state = 265 self.statement() @@ -1761,21 +1769,21 @@ def whileStmt(self): self.enterRule(localctx, 22, self.RULE_whileStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 266 + self.state = 268 self.match(HogQLParser.WHILE) - self.state = 267 + self.state = 269 self.match(HogQLParser.LPAREN) - self.state = 268 + self.state = 270 self.expression() - self.state = 269 + self.state = 271 self.match(HogQLParser.RPAREN) - self.state = 270 - self.statement() self.state = 272 + self.statement() + self.state = 274 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,15,self._ctx) if la_ == 1: - self.state = 271 + self.state = 273 self.match(HogQLParser.SEMICOLON) @@ -1861,63 +1869,63 @@ def forStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 274 + self.state = 276 self.match(HogQLParser.FOR) - self.state = 275 + self.state = 277 self.match(HogQLParser.LPAREN) - self.state = 279 + self.state = 281 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,16,self._ctx) if la_ == 1: - self.state = 276 + self.state = 278 localctx.initializerVarDeclr = self.varDecl() elif la_ == 2: - self.state = 277 + self.state = 279 localctx.initializerVarAssignment = self.varAssignment() elif la_ == 3: - self.state = 278 + self.state = 280 localctx.initializerExpression = self.expression() - self.state = 281 - self.match(HogQLParser.SEMICOLON) self.state = 283 + self.match(HogQLParser.SEMICOLON) + self.state = 285 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 282 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 284 localctx.condition = self.expression() - self.state = 285 + self.state = 287 self.match(HogQLParser.SEMICOLON) - self.state = 289 + self.state = 291 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,18,self._ctx) if la_ == 1: - self.state = 286 + self.state = 288 localctx.incrementVarDeclr = self.varDecl() elif la_ == 2: - self.state = 287 + self.state = 289 localctx.incrementVarAssignment = self.varAssignment() elif la_ == 3: - self.state = 288 + self.state = 290 localctx.incrementExpression = self.expression() - self.state = 291 + self.state = 293 self.match(HogQLParser.RPAREN) - self.state = 292 - self.statement() self.state = 294 + self.statement() + self.state = 296 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,19,self._ctx) if la_ == 1: - self.state = 293 + self.state = 295 self.match(HogQLParser.SEMICOLON) @@ -1992,37 +2000,37 @@ def forInStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 296 + self.state = 298 self.match(HogQLParser.FOR) - self.state = 297 + self.state = 299 self.match(HogQLParser.LPAREN) - self.state = 298 + self.state = 300 self.match(HogQLParser.LET) - self.state = 299 + self.state = 301 self.identifier() - self.state = 302 + self.state = 304 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 300 + if _la==119: + self.state = 302 self.match(HogQLParser.COMMA) - self.state = 301 + self.state = 303 self.identifier() - self.state = 304 + self.state = 306 self.match(HogQLParser.IN) - self.state = 305 + self.state = 307 self.expression() - self.state = 306 + self.state = 308 self.match(HogQLParser.RPAREN) - self.state = 307 - self.statement() self.state = 309 + self.statement() + self.state = 311 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,21,self._ctx) if la_ == 1: - self.state = 308 + self.state = 310 self.match(HogQLParser.SEMICOLON) @@ -2085,28 +2093,28 @@ def funcStmt(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 311 + self.state = 313 _la = self._input.LA(1) - if not(_la==31 or _la==36): + if not(_la==32 or _la==37): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 312 + self.state = 314 self.identifier() - self.state = 313 - self.match(HogQLParser.LPAREN) self.state = 315 + self.match(HogQLParser.LPAREN) + self.state = 317 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 314 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 316 self.identifierList() - self.state = 317 + self.state = 319 self.match(HogQLParser.RPAREN) - self.state = 318 + self.state = 320 self.block() except RecognitionException as re: localctx.exception = re @@ -2155,13 +2163,13 @@ def varAssignment(self): self.enterRule(localctx, 30, self.RULE_varAssignment) try: self.enterOuterAlt(localctx, 1) - self.state = 320 + self.state = 322 self.expression() - self.state = 321 + self.state = 323 self.match(HogQLParser.COLON) - self.state = 322 + self.state = 324 self.match(HogQLParser.EQ_SINGLE) - self.state = 323 + self.state = 325 self.expression() except RecognitionException as re: localctx.exception = re @@ -2204,13 +2212,13 @@ def exprStmt(self): self.enterRule(localctx, 32, self.RULE_exprStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 325 - self.expression() self.state = 327 + self.expression() + self.state = 329 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,23,self._ctx) if la_ == 1: - self.state = 326 + self.state = 328 self.match(HogQLParser.SEMICOLON) @@ -2251,7 +2259,7 @@ def emptyStmt(self): self.enterRule(localctx, 34, self.RULE_emptyStmt) try: self.enterOuterAlt(localctx, 1) - self.state = 329 + self.state = 331 self.match(HogQLParser.SEMICOLON) except RecognitionException as re: localctx.exception = re @@ -2301,19 +2309,19 @@ def block(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 331 + self.state = 333 self.match(HogQLParser.LBRACE) - self.state = 335 + self.state = 337 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -536887298) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986211001696255) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 4212759) != 0): - self.state = 332 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -140738696331266) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944844006785023) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 4212759) != 0): + self.state = 334 self.declaration() - self.state = 337 + self.state = 339 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 338 + self.state = 340 self.match(HogQLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -2359,11 +2367,11 @@ def kvPair(self): self.enterRule(localctx, 38, self.RULE_kvPair) try: self.enterOuterAlt(localctx, 1) - self.state = 340 + self.state = 342 self.expression() - self.state = 341 + self.state = 343 self.match(HogQLParser.COLON) - self.state = 342 + self.state = 344 self.expression() except RecognitionException as re: localctx.exception = re @@ -2413,26 +2421,26 @@ def kvPairList(self): self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 344 + self.state = 346 self.kvPair() - self.state = 349 + self.state = 351 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,25,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 345 + self.state = 347 self.match(HogQLParser.COMMA) - self.state = 346 + self.state = 348 self.kvPair() - self.state = 351 + self.state = 353 self._errHandler.sync(self) _alt = self._interp.adaptivePredict(self._input,25,self._ctx) - self.state = 353 + self.state = 355 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 352 + if _la==119: + self.state = 354 self.match(HogQLParser.COMMA) @@ -2455,8 +2463,8 @@ def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): def EOF(self): return self.getToken(HogQLParser.EOF, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def selectStmt(self): @@ -2485,26 +2493,26 @@ def select(self): self.enterRule(localctx, 42, self.RULE_select) try: self.enterOuterAlt(localctx, 1) - self.state = 358 + self.state = 360 self._errHandler.sync(self) la_ = self._interp.adaptivePredict(self._input,27,self._ctx) if la_ == 1: - self.state = 355 - self.selectUnionStmt() + self.state = 357 + self.selectSetStmt() pass elif la_ == 2: - self.state = 356 + self.state = 358 self.selectStmt() pass elif la_ == 3: - self.state = 357 + self.state = 359 self.hogqlxTagElement() pass - self.state = 360 + self.state = 362 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -2515,66 +2523,72 @@ def select(self): return localctx - class SelectUnionStmtContext(ParserRuleContext): + class SelectStmtWithParensContext(ParserRuleContext): __slots__ = 'parser' def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): super().__init__(parent, invokingState) self.parser = parser - def selectStmtWithParens(self, i:int=None): - if i is None: - return self.getTypedRuleContexts(HogQLParser.SelectStmtWithParensContext) - else: - return self.getTypedRuleContext(HogQLParser.SelectStmtWithParensContext,i) + def selectStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectStmtContext,0) - def UNION(self, i:int=None): - if i is None: - return self.getTokens(HogQLParser.UNION) - else: - return self.getToken(HogQLParser.UNION, i) + def LPAREN(self): + return self.getToken(HogQLParser.LPAREN, 0) + + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) + + + def RPAREN(self): + return self.getToken(HogQLParser.RPAREN, 0) + + def placeholder(self): + return self.getTypedRuleContext(HogQLParser.PlaceholderContext,0) - def ALL(self, i:int=None): - if i is None: - return self.getTokens(HogQLParser.ALL) - else: - return self.getToken(HogQLParser.ALL, i) def getRuleIndex(self): - return HogQLParser.RULE_selectUnionStmt + return HogQLParser.RULE_selectStmtWithParens def accept(self, visitor:ParseTreeVisitor): - if hasattr( visitor, "visitSelectUnionStmt" ): - return visitor.visitSelectUnionStmt(self) + if hasattr( visitor, "visitSelectStmtWithParens" ): + return visitor.visitSelectStmtWithParens(self) else: return visitor.visitChildren(self) - def selectUnionStmt(self): + def selectStmtWithParens(self): - localctx = HogQLParser.SelectUnionStmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 44, self.RULE_selectUnionStmt) - self._la = 0 # Token type + localctx = HogQLParser.SelectStmtWithParensContext(self, self._ctx, self.state) + self.enterRule(localctx, 44, self.RULE_selectStmtWithParens) try: - self.enterOuterAlt(localctx, 1) - self.state = 362 - self.selectStmtWithParens() - self.state = 368 + self.state = 370 self._errHandler.sync(self) - _la = self._input.LA(1) - while _la==96: - self.state = 363 - self.match(HogQLParser.UNION) + token = self._input.LA(1) + if token in [82, 105]: + self.enterOuterAlt(localctx, 1) self.state = 364 - self.match(HogQLParser.ALL) + self.selectStmt() + pass + elif token in [133]: + self.enterOuterAlt(localctx, 2) self.state = 365 - self.selectStmtWithParens() - self.state = 370 - self._errHandler.sync(self) - _la = self._input.LA(1) + self.match(HogQLParser.LPAREN) + self.state = 366 + self.selectSetStmt() + self.state = 367 + self.match(HogQLParser.RPAREN) + pass + elif token in [131]: + self.enterOuterAlt(localctx, 3) + self.state = 369 + self.placeholder() + pass + else: + raise NoViableAltException(self) except RecognitionException as re: localctx.exception = re @@ -2585,73 +2599,127 @@ def selectUnionStmt(self): return localctx - class SelectStmtWithParensContext(ParserRuleContext): + class SubsequentSelectSetClauseContext(ParserRuleContext): __slots__ = 'parser' def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): super().__init__(parent, invokingState) self.parser = parser - def selectStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectStmtContext,0) - + def selectStmtWithParens(self): + return self.getTypedRuleContext(HogQLParser.SelectStmtWithParensContext,0) - def LPAREN(self): - return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def EXCEPT(self): + return self.getToken(HogQLParser.EXCEPT, 0) + def UNION(self): + return self.getToken(HogQLParser.UNION, 0) - def RPAREN(self): - return self.getToken(HogQLParser.RPAREN, 0) - - def placeholder(self): - return self.getTypedRuleContext(HogQLParser.PlaceholderContext,0) + def ALL(self): + return self.getToken(HogQLParser.ALL, 0) + def INTERSECT(self): + return self.getToken(HogQLParser.INTERSECT, 0) def getRuleIndex(self): - return HogQLParser.RULE_selectStmtWithParens + return HogQLParser.RULE_subsequentSelectSetClause def accept(self, visitor:ParseTreeVisitor): - if hasattr( visitor, "visitSelectStmtWithParens" ): - return visitor.visitSelectStmtWithParens(self) + if hasattr( visitor, "visitSubsequentSelectSetClause" ): + return visitor.visitSubsequentSelectSetClause(self) else: return visitor.visitChildren(self) - def selectStmtWithParens(self): + def subsequentSelectSetClause(self): - localctx = HogQLParser.SelectStmtWithParensContext(self, self._ctx, self.state) - self.enterRule(localctx, 46, self.RULE_selectStmtWithParens) + localctx = HogQLParser.SubsequentSelectSetClauseContext(self, self._ctx, self.state) + self.enterRule(localctx, 46, self.RULE_subsequentSelectSetClause) try: - self.state = 377 + self.enterOuterAlt(localctx, 1) + self.state = 376 self._errHandler.sync(self) token = self._input.LA(1) - if token in [80, 103]: - self.enterOuterAlt(localctx, 1) - self.state = 371 - self.selectStmt() - pass - elif token in [131]: - self.enterOuterAlt(localctx, 2) + if token in [27]: self.state = 372 - self.match(HogQLParser.LPAREN) + self.match(HogQLParser.EXCEPT) + pass + elif token in [98]: self.state = 373 - self.selectUnionStmt() + self.match(HogQLParser.UNION) self.state = 374 - self.match(HogQLParser.RPAREN) + self.match(HogQLParser.ALL) pass - elif token in [129]: - self.enterOuterAlt(localctx, 3) - self.state = 376 - self.placeholder() + elif token in [47]: + self.state = 375 + self.match(HogQLParser.INTERSECT) pass else: raise NoViableAltException(self) + self.state = 378 + self.selectStmtWithParens() + except RecognitionException as re: + localctx.exception = re + self._errHandler.reportError(self, re) + self._errHandler.recover(self, re) + finally: + self.exitRule() + return localctx + + + class SelectSetStmtContext(ParserRuleContext): + __slots__ = 'parser' + + def __init__(self, parser, parent:ParserRuleContext=None, invokingState:int=-1): + super().__init__(parent, invokingState) + self.parser = parser + + def selectStmtWithParens(self): + return self.getTypedRuleContext(HogQLParser.SelectStmtWithParensContext,0) + + + def subsequentSelectSetClause(self, i:int=None): + if i is None: + return self.getTypedRuleContexts(HogQLParser.SubsequentSelectSetClauseContext) + else: + return self.getTypedRuleContext(HogQLParser.SubsequentSelectSetClauseContext,i) + + + def getRuleIndex(self): + return HogQLParser.RULE_selectSetStmt + + def accept(self, visitor:ParseTreeVisitor): + if hasattr( visitor, "visitSelectSetStmt" ): + return visitor.visitSelectSetStmt(self) + else: + return visitor.visitChildren(self) + + + + + def selectSetStmt(self): + + localctx = HogQLParser.SelectSetStmtContext(self, self._ctx, self.state) + self.enterRule(localctx, 48, self.RULE_selectSetStmt) + self._la = 0 # Token type + try: + self.enterOuterAlt(localctx, 1) + self.state = 380 + self.selectStmtWithParens() + self.state = 384 + self._errHandler.sync(self) + _la = self._input.LA(1) + while _la==27 or _la==47 or _la==98: + self.state = 381 + self.subsequentSelectSetClause() + self.state = 386 + self._errHandler.sync(self) + _la = self._input.LA(1) + except RecognitionException as re: localctx.exception = re self._errHandler.reportError(self, re) @@ -2764,147 +2832,147 @@ def accept(self, visitor:ParseTreeVisitor): def selectStmt(self): localctx = HogQLParser.SelectStmtContext(self, self._ctx, self.state) - self.enterRule(localctx, 48, self.RULE_selectStmt) + self.enterRule(localctx, 50, self.RULE_selectStmt) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 380 + self.state = 388 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==103: - self.state = 379 + if _la==105: + self.state = 387 localctx.with_ = self.withClause() - self.state = 382 + self.state = 390 self.match(HogQLParser.SELECT) - self.state = 384 + self.state = 392 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,31,self._ctx) + la_ = self._interp.adaptivePredict(self._input,32,self._ctx) if la_ == 1: - self.state = 383 + self.state = 391 self.match(HogQLParser.DISTINCT) - self.state = 387 + self.state = 395 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,32,self._ctx) + la_ = self._interp.adaptivePredict(self._input,33,self._ctx) if la_ == 1: - self.state = 386 + self.state = 394 self.topClause() - self.state = 389 + self.state = 397 localctx.columns = self.columnExprList() - self.state = 391 + self.state = 399 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==34: - self.state = 390 + if _la==35: + self.state = 398 localctx.from_ = self.fromClause() - self.state = 394 + self.state = 402 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 4538783999459360) != 0): - self.state = 393 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 18084767253659680) != 0): + self.state = 401 self.arrayJoinClause() - self.state = 397 + self.state = 405 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==70: - self.state = 396 + if _la==72: + self.state = 404 self.prewhereClause() - self.state = 400 + self.state = 408 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==100: - self.state = 399 + if _la==102: + self.state = 407 localctx.where = self.whereClause() - self.state = 403 + self.state = 411 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==37: - self.state = 402 + if _la==38: + self.state = 410 self.groupByClause() - self.state = 407 + self.state = 415 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,38,self._ctx) + la_ = self._interp.adaptivePredict(self._input,39,self._ctx) if la_ == 1: - self.state = 405 + self.state = 413 self.match(HogQLParser.WITH) - self.state = 406 + self.state = 414 _la = self._input.LA(1) - if not(_la==18 or _la==75): + if not(_la==18 or _la==77): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 411 + self.state = 419 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==103: - self.state = 409 + if _la==105: + self.state = 417 self.match(HogQLParser.WITH) - self.state = 410 + self.state = 418 self.match(HogQLParser.TOTALS) - self.state = 414 + self.state = 422 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==38: - self.state = 413 + if _la==39: + self.state = 421 self.havingClause() - self.state = 417 + self.state = 425 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==102: - self.state = 416 + if _la==104: + self.state = 424 self.windowClause() - self.state = 420 + self.state = 428 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==65: - self.state = 419 + if _la==67: + self.state = 427 self.orderByClause() - self.state = 424 + self.state = 432 self._errHandler.sync(self) token = self._input.LA(1) - if token in [55]: - self.state = 422 + if token in [57]: + self.state = 430 self.limitAndOffsetClause() pass - elif token in [62]: - self.state = 423 + elif token in [64]: + self.state = 431 self.offsetOnlyClause() pass - elif token in [-1, 82, 96, 150]: + elif token in [-1, 27, 47, 84, 98, 152]: pass else: pass - self.state = 427 + self.state = 435 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==82: - self.state = 426 + if _la==84: + self.state = 434 self.settingsClause() @@ -2946,12 +3014,12 @@ def accept(self, visitor:ParseTreeVisitor): def withClause(self): localctx = HogQLParser.WithClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 50, self.RULE_withClause) + self.enterRule(localctx, 52, self.RULE_withClause) try: self.enterOuterAlt(localctx, 1) - self.state = 429 + self.state = 437 self.match(HogQLParser.WITH) - self.state = 430 + self.state = 438 self.withExprList() except RecognitionException as re: localctx.exception = re @@ -2996,20 +3064,20 @@ def accept(self, visitor:ParseTreeVisitor): def topClause(self): localctx = HogQLParser.TopClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 52, self.RULE_topClause) + self.enterRule(localctx, 54, self.RULE_topClause) try: self.enterOuterAlt(localctx, 1) - self.state = 432 + self.state = 440 self.match(HogQLParser.TOP) - self.state = 433 + self.state = 441 self.match(HogQLParser.DECIMAL_LITERAL) - self.state = 436 + self.state = 444 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,45,self._ctx) + la_ = self._interp.adaptivePredict(self._input,46,self._ctx) if la_ == 1: - self.state = 434 + self.state = 442 self.match(HogQLParser.WITH) - self.state = 435 + self.state = 443 self.match(HogQLParser.TIES) @@ -3051,12 +3119,12 @@ def accept(self, visitor:ParseTreeVisitor): def fromClause(self): localctx = HogQLParser.FromClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 54, self.RULE_fromClause) + self.enterRule(localctx, 56, self.RULE_fromClause) try: self.enterOuterAlt(localctx, 1) - self.state = 438 + self.state = 446 self.match(HogQLParser.FROM) - self.state = 439 + self.state = 447 self.joinExpr(0) except RecognitionException as re: localctx.exception = re @@ -3105,28 +3173,28 @@ def accept(self, visitor:ParseTreeVisitor): def arrayJoinClause(self): localctx = HogQLParser.ArrayJoinClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 56, self.RULE_arrayJoinClause) + self.enterRule(localctx, 58, self.RULE_arrayJoinClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 442 + self.state = 450 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==45 or _la==52: - self.state = 441 + if _la==46 or _la==54: + self.state = 449 _la = self._input.LA(1) - if not(_la==45 or _la==52): + if not(_la==46 or _la==54): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 444 + self.state = 452 self.match(HogQLParser.ARRAY) - self.state = 445 + self.state = 453 self.match(HogQLParser.JOIN) - self.state = 446 + self.state = 454 self.columnExprList() except RecognitionException as re: localctx.exception = re @@ -3200,39 +3268,39 @@ def accept(self, visitor:ParseTreeVisitor): def windowClause(self): localctx = HogQLParser.WindowClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 58, self.RULE_windowClause) + self.enterRule(localctx, 60, self.RULE_windowClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 448 + self.state = 456 self.match(HogQLParser.WINDOW) - self.state = 449 + self.state = 457 self.identifier() - self.state = 450 + self.state = 458 self.match(HogQLParser.AS) - self.state = 451 + self.state = 459 self.match(HogQLParser.LPAREN) - self.state = 452 + self.state = 460 self.windowExpr() - self.state = 453 + self.state = 461 self.match(HogQLParser.RPAREN) - self.state = 463 + self.state = 471 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==117: - self.state = 454 + while _la==119: + self.state = 462 self.match(HogQLParser.COMMA) - self.state = 455 + self.state = 463 self.identifier() - self.state = 456 + self.state = 464 self.match(HogQLParser.AS) - self.state = 457 + self.state = 465 self.match(HogQLParser.LPAREN) - self.state = 458 + self.state = 466 self.windowExpr() - self.state = 459 + self.state = 467 self.match(HogQLParser.RPAREN) - self.state = 465 + self.state = 473 self._errHandler.sync(self) _la = self._input.LA(1) @@ -3274,12 +3342,12 @@ def accept(self, visitor:ParseTreeVisitor): def prewhereClause(self): localctx = HogQLParser.PrewhereClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 60, self.RULE_prewhereClause) + self.enterRule(localctx, 62, self.RULE_prewhereClause) try: self.enterOuterAlt(localctx, 1) - self.state = 466 + self.state = 474 self.match(HogQLParser.PREWHERE) - self.state = 467 + self.state = 475 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3319,12 +3387,12 @@ def accept(self, visitor:ParseTreeVisitor): def whereClause(self): localctx = HogQLParser.WhereClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 62, self.RULE_whereClause) + self.enterRule(localctx, 64, self.RULE_whereClause) try: self.enterOuterAlt(localctx, 1) - self.state = 469 + self.state = 477 self.match(HogQLParser.WHERE) - self.state = 470 + self.state = 478 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3379,35 +3447,35 @@ def accept(self, visitor:ParseTreeVisitor): def groupByClause(self): localctx = HogQLParser.GroupByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 64, self.RULE_groupByClause) + self.enterRule(localctx, 66, self.RULE_groupByClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 472 + self.state = 480 self.match(HogQLParser.GROUP) - self.state = 473 + self.state = 481 self.match(HogQLParser.BY) - self.state = 480 + self.state = 488 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,48,self._ctx) + la_ = self._interp.adaptivePredict(self._input,49,self._ctx) if la_ == 1: - self.state = 474 + self.state = 482 _la = self._input.LA(1) - if not(_la==18 or _la==75): + if not(_la==18 or _la==77): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 475 + self.state = 483 self.match(HogQLParser.LPAREN) - self.state = 476 + self.state = 484 self.columnExprList() - self.state = 477 + self.state = 485 self.match(HogQLParser.RPAREN) pass elif la_ == 2: - self.state = 479 + self.state = 487 self.columnExprList() pass @@ -3450,12 +3518,12 @@ def accept(self, visitor:ParseTreeVisitor): def havingClause(self): localctx = HogQLParser.HavingClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 66, self.RULE_havingClause) + self.enterRule(localctx, 68, self.RULE_havingClause) try: self.enterOuterAlt(localctx, 1) - self.state = 482 + self.state = 490 self.match(HogQLParser.HAVING) - self.state = 483 + self.state = 491 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3498,14 +3566,14 @@ def accept(self, visitor:ParseTreeVisitor): def orderByClause(self): localctx = HogQLParser.OrderByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 68, self.RULE_orderByClause) + self.enterRule(localctx, 70, self.RULE_orderByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 485 + self.state = 493 self.match(HogQLParser.ORDER) - self.state = 486 + self.state = 494 self.match(HogQLParser.BY) - self.state = 487 + self.state = 495 self.orderExprList() except RecognitionException as re: localctx.exception = re @@ -3548,14 +3616,14 @@ def accept(self, visitor:ParseTreeVisitor): def projectionOrderByClause(self): localctx = HogQLParser.ProjectionOrderByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 70, self.RULE_projectionOrderByClause) + self.enterRule(localctx, 72, self.RULE_projectionOrderByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 489 + self.state = 497 self.match(HogQLParser.ORDER) - self.state = 490 + self.state = 498 self.match(HogQLParser.BY) - self.state = 491 + self.state = 499 self.columnExprList() except RecognitionException as re: localctx.exception = re @@ -3617,44 +3685,44 @@ def accept(self, visitor:ParseTreeVisitor): def limitAndOffsetClause(self): localctx = HogQLParser.LimitAndOffsetClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 72, self.RULE_limitAndOffsetClause) + self.enterRule(localctx, 74, self.RULE_limitAndOffsetClause) self._la = 0 # Token type try: - self.state = 522 + self.state = 530 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,53,self._ctx) + la_ = self._interp.adaptivePredict(self._input,54,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 493 + self.state = 501 self.match(HogQLParser.LIMIT) - self.state = 494 + self.state = 502 self.columnExpr(0) - self.state = 497 + self.state = 505 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 495 + if _la==119: + self.state = 503 self.match(HogQLParser.COMMA) - self.state = 496 + self.state = 504 self.columnExpr(0) - self.state = 503 + self.state = 511 self._errHandler.sync(self) token = self._input.LA(1) - if token in [103]: - self.state = 499 + if token in [105]: + self.state = 507 self.match(HogQLParser.WITH) - self.state = 500 + self.state = 508 self.match(HogQLParser.TIES) pass elif token in [11]: - self.state = 501 + self.state = 509 self.match(HogQLParser.BY) - self.state = 502 + self.state = 510 self.columnExprList() pass - elif token in [-1, 82, 96, 150]: + elif token in [-1, 27, 47, 84, 98, 152]: pass else: pass @@ -3662,43 +3730,43 @@ def limitAndOffsetClause(self): elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 505 + self.state = 513 self.match(HogQLParser.LIMIT) - self.state = 506 + self.state = 514 self.columnExpr(0) - self.state = 509 + self.state = 517 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==103: - self.state = 507 + if _la==105: + self.state = 515 self.match(HogQLParser.WITH) - self.state = 508 + self.state = 516 self.match(HogQLParser.TIES) - self.state = 511 + self.state = 519 self.match(HogQLParser.OFFSET) - self.state = 512 + self.state = 520 self.columnExpr(0) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 514 + self.state = 522 self.match(HogQLParser.LIMIT) - self.state = 515 + self.state = 523 self.columnExpr(0) - self.state = 516 + self.state = 524 self.match(HogQLParser.OFFSET) - self.state = 517 + self.state = 525 self.columnExpr(0) - self.state = 520 + self.state = 528 self._errHandler.sync(self) _la = self._input.LA(1) if _la==11: - self.state = 518 + self.state = 526 self.match(HogQLParser.BY) - self.state = 519 + self.state = 527 self.columnExprList() @@ -3743,12 +3811,12 @@ def accept(self, visitor:ParseTreeVisitor): def offsetOnlyClause(self): localctx = HogQLParser.OffsetOnlyClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 74, self.RULE_offsetOnlyClause) + self.enterRule(localctx, 76, self.RULE_offsetOnlyClause) try: self.enterOuterAlt(localctx, 1) - self.state = 524 + self.state = 532 self.match(HogQLParser.OFFSET) - self.state = 525 + self.state = 533 self.columnExpr(0) except RecognitionException as re: localctx.exception = re @@ -3788,12 +3856,12 @@ def accept(self, visitor:ParseTreeVisitor): def settingsClause(self): localctx = HogQLParser.SettingsClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 76, self.RULE_settingsClause) + self.enterRule(localctx, 78, self.RULE_settingsClause) try: self.enterOuterAlt(localctx, 1) - self.state = 527 + self.state = 535 self.match(HogQLParser.SETTINGS) - self.state = 528 + self.state = 536 self.settingExprList() except RecognitionException as re: localctx.exception = re @@ -3920,34 +3988,34 @@ def joinExpr(self, _p:int=0): _parentState = self.state localctx = HogQLParser.JoinExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 78 - self.enterRecursionRule(localctx, 78, self.RULE_joinExpr, _p) + _startState = 80 + self.enterRecursionRule(localctx, 80, self.RULE_joinExpr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 542 + self.state = 550 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,56,self._ctx) + la_ = self._interp.adaptivePredict(self._input,57,self._ctx) if la_ == 1: localctx = HogQLParser.JoinExprTableContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 531 + self.state = 539 self.tableExpr(0) - self.state = 533 + self.state = 541 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,54,self._ctx) + la_ = self._interp.adaptivePredict(self._input,55,self._ctx) if la_ == 1: - self.state = 532 + self.state = 540 self.match(HogQLParser.FINAL) - self.state = 536 + self.state = 544 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,55,self._ctx) + la_ = self._interp.adaptivePredict(self._input,56,self._ctx) if la_ == 1: - self.state = 535 + self.state = 543 self.sampleClause() @@ -3957,67 +4025,67 @@ def joinExpr(self, _p:int=0): localctx = HogQLParser.JoinExprParensContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 538 + self.state = 546 self.match(HogQLParser.LPAREN) - self.state = 539 + self.state = 547 self.joinExpr(0) - self.state = 540 + self.state = 548 self.match(HogQLParser.RPAREN) pass self._ctx.stop = self._input.LT(-1) - self.state = 558 + self.state = 566 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,59,self._ctx) + _alt = self._interp.adaptivePredict(self._input,60,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 556 + self.state = 564 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,58,self._ctx) + la_ = self._interp.adaptivePredict(self._input,59,self._ctx) if la_ == 1: localctx = HogQLParser.JoinExprCrossOpContext(self, HogQLParser.JoinExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_joinExpr) - self.state = 544 + self.state = 552 if not self.precpred(self._ctx, 3): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 545 + self.state = 553 self.joinOpCross() - self.state = 546 + self.state = 554 self.joinExpr(4) pass elif la_ == 2: localctx = HogQLParser.JoinExprOpContext(self, HogQLParser.JoinExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_joinExpr) - self.state = 548 + self.state = 556 if not self.precpred(self._ctx, 4): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 4)") - self.state = 550 + self.state = 558 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 4538818359197978) != 0) or _la==74 or _la==81: - self.state = 549 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 18084835973136666) != 0) or _la==76 or _la==83: + self.state = 557 self.joinOp() - self.state = 552 + self.state = 560 self.match(HogQLParser.JOIN) - self.state = 553 + self.state = 561 self.joinExpr(0) - self.state = 554 + self.state = 562 self.joinConstraintClause() pass - self.state = 560 + self.state = 568 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,59,self._ctx) + _alt = self._interp.adaptivePredict(self._input,60,self._ctx) except RecognitionException as re: localctx.exception = re @@ -4123,24 +4191,24 @@ def accept(self, visitor:ParseTreeVisitor): def joinOp(self): localctx = HogQLParser.JoinOpContext(self, self._ctx, self.state) - self.enterRule(localctx, 80, self.RULE_joinOp) + self.enterRule(localctx, 82, self.RULE_joinOp) self._la = 0 # Token type try: - self.state = 604 + self.state = 612 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,73,self._ctx) + la_ = self._interp.adaptivePredict(self._input,74,self._ctx) if la_ == 1: localctx = HogQLParser.JoinOpInnerContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 570 + self.state = 578 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,62,self._ctx) + la_ = self._interp.adaptivePredict(self._input,63,self._ctx) if la_ == 1: - self.state = 562 + self.state = 570 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0): - self.state = 561 + self.state = 569 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0)): self._errHandler.recoverInline(self) @@ -4149,18 +4217,18 @@ def joinOp(self): self.consume() - self.state = 564 + self.state = 572 self.match(HogQLParser.INNER) pass elif la_ == 2: - self.state = 565 + self.state = 573 self.match(HogQLParser.INNER) - self.state = 567 + self.state = 575 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0): - self.state = 566 + self.state = 574 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0)): self._errHandler.recoverInline(self) @@ -4172,7 +4240,7 @@ def joinOp(self): pass elif la_ == 3: - self.state = 569 + self.state = 577 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 274) != 0)): self._errHandler.recoverInline(self) @@ -4187,63 +4255,63 @@ def joinOp(self): elif la_ == 2: localctx = HogQLParser.JoinOpLeftRightContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 586 + self.state = 594 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,67,self._ctx) + la_ = self._interp.adaptivePredict(self._input,68,self._ctx) if la_ == 1: - self.state = 573 + self.state = 581 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81: - self.state = 572 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83: + self.state = 580 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 575 + self.state = 583 _la = self._input.LA(1) - if not(_la==52 or _la==74): + if not(_la==54 or _la==76): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 577 + self.state = 585 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 576 + if _la==68: + self.state = 584 self.match(HogQLParser.OUTER) pass elif la_ == 2: - self.state = 579 + self.state = 587 _la = self._input.LA(1) - if not(_la==52 or _la==74): + if not(_la==54 or _la==76): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 581 + self.state = 589 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 580 + if _la==68: + self.state = 588 self.match(HogQLParser.OUTER) - self.state = 584 + self.state = 592 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81: - self.state = 583 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83: + self.state = 591 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==81): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 282) != 0) or _la==83): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -4258,15 +4326,15 @@ def joinOp(self): elif la_ == 3: localctx = HogQLParser.JoinOpFullContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 602 + self.state = 610 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,72,self._ctx) + la_ = self._interp.adaptivePredict(self._input,73,self._ctx) if la_ == 1: - self.state = 589 + self.state = 597 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1 or _la==4: - self.state = 588 + self.state = 596 _la = self._input.LA(1) if not(_la==1 or _la==4): self._errHandler.recoverInline(self) @@ -4275,34 +4343,34 @@ def joinOp(self): self.consume() - self.state = 591 + self.state = 599 self.match(HogQLParser.FULL) - self.state = 593 + self.state = 601 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 592 + if _la==68: + self.state = 600 self.match(HogQLParser.OUTER) pass elif la_ == 2: - self.state = 595 + self.state = 603 self.match(HogQLParser.FULL) - self.state = 597 + self.state = 605 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==66: - self.state = 596 + if _la==68: + self.state = 604 self.match(HogQLParser.OUTER) - self.state = 600 + self.state = 608 self._errHandler.sync(self) _la = self._input.LA(1) if _la==1 or _la==4: - self.state = 599 + self.state = 607 _la = self._input.LA(1) if not(_la==1 or _la==4): self._errHandler.recoverInline(self) @@ -4357,21 +4425,21 @@ def accept(self, visitor:ParseTreeVisitor): def joinOpCross(self): localctx = HogQLParser.JoinOpCrossContext(self, self._ctx, self.state) - self.enterRule(localctx, 82, self.RULE_joinOpCross) + self.enterRule(localctx, 84, self.RULE_joinOpCross) try: - self.state = 609 + self.state = 617 self._errHandler.sync(self) token = self._input.LA(1) if token in [17]: self.enterOuterAlt(localctx, 1) - self.state = 606 + self.state = 614 self.match(HogQLParser.CROSS) - self.state = 607 + self.state = 615 self.match(HogQLParser.JOIN) pass - elif token in [117]: + elif token in [119]: self.enterOuterAlt(localctx, 2) - self.state = 608 + self.state = 616 self.match(HogQLParser.COMMA) pass else: @@ -4424,36 +4492,36 @@ def accept(self, visitor:ParseTreeVisitor): def joinConstraintClause(self): localctx = HogQLParser.JoinConstraintClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 84, self.RULE_joinConstraintClause) + self.enterRule(localctx, 86, self.RULE_joinConstraintClause) try: - self.state = 620 + self.state = 628 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,75,self._ctx) + la_ = self._interp.adaptivePredict(self._input,76,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 611 + self.state = 619 self.match(HogQLParser.ON) - self.state = 612 + self.state = 620 self.columnExprList() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 613 + self.state = 621 self.match(HogQLParser.USING) - self.state = 614 + self.state = 622 self.match(HogQLParser.LPAREN) - self.state = 615 + self.state = 623 self.columnExprList() - self.state = 616 + self.state = 624 self.match(HogQLParser.RPAREN) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 618 + self.state = 626 self.match(HogQLParser.USING) - self.state = 619 + self.state = 627 self.columnExprList() pass @@ -4502,20 +4570,20 @@ def accept(self, visitor:ParseTreeVisitor): def sampleClause(self): localctx = HogQLParser.SampleClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 86, self.RULE_sampleClause) + self.enterRule(localctx, 88, self.RULE_sampleClause) try: self.enterOuterAlt(localctx, 1) - self.state = 622 + self.state = 630 self.match(HogQLParser.SAMPLE) - self.state = 623 + self.state = 631 self.ratioExpr() - self.state = 626 + self.state = 634 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,76,self._ctx) + la_ = self._interp.adaptivePredict(self._input,77,self._ctx) if la_ == 1: - self.state = 624 + self.state = 632 self.match(HogQLParser.OFFSET) - self.state = 625 + self.state = 633 self.ratioExpr() @@ -4563,21 +4631,21 @@ def accept(self, visitor:ParseTreeVisitor): def orderExprList(self): localctx = HogQLParser.OrderExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 88, self.RULE_orderExprList) + self.enterRule(localctx, 90, self.RULE_orderExprList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 628 + self.state = 636 self.orderExpr() - self.state = 633 + self.state = 641 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==117: - self.state = 629 + while _la==119: + self.state = 637 self.match(HogQLParser.COMMA) - self.state = 630 + self.state = 638 self.orderExpr() - self.state = 635 + self.state = 643 self._errHandler.sync(self) _la = self._input.LA(1) @@ -4640,17 +4708,17 @@ def accept(self, visitor:ParseTreeVisitor): def orderExpr(self): localctx = HogQLParser.OrderExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 90, self.RULE_orderExpr) + self.enterRule(localctx, 92, self.RULE_orderExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 636 + self.state = 644 self.columnExpr(0) - self.state = 638 + self.state = 646 self._errHandler.sync(self) _la = self._input.LA(1) if (((_la) & ~0x3f) == 0 and ((1 << _la) & 12583040) != 0): - self.state = 637 + self.state = 645 _la = self._input.LA(1) if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 12583040) != 0)): self._errHandler.recoverInline(self) @@ -4659,28 +4727,28 @@ def orderExpr(self): self.consume() - self.state = 642 + self.state = 650 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==61: - self.state = 640 + if _la==63: + self.state = 648 self.match(HogQLParser.NULLS) - self.state = 641 + self.state = 649 _la = self._input.LA(1) - if not(_la==30 or _la==50): + if not(_la==31 or _la==52): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 646 + self.state = 654 self._errHandler.sync(self) _la = self._input.LA(1) if _la==16: - self.state = 644 + self.state = 652 self.match(HogQLParser.COLLATE) - self.state = 645 + self.state = 653 self.match(HogQLParser.STRING_LITERAL) @@ -4729,27 +4797,27 @@ def accept(self, visitor:ParseTreeVisitor): def ratioExpr(self): localctx = HogQLParser.RatioExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 92, self.RULE_ratioExpr) + self.enterRule(localctx, 94, self.RULE_ratioExpr) try: - self.state = 654 + self.state = 662 self._errHandler.sync(self) token = self._input.LA(1) - if token in [129]: + if token in [131]: self.enterOuterAlt(localctx, 1) - self.state = 648 + self.state = 656 self.placeholder() pass - elif token in [44, 58, 107, 108, 109, 110, 119, 121, 140]: + elif token in [45, 60, 109, 110, 111, 112, 121, 123, 142]: self.enterOuterAlt(localctx, 2) - self.state = 649 + self.state = 657 self.numberLiteral() - self.state = 652 + self.state = 660 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,81,self._ctx) + la_ = self._interp.adaptivePredict(self._input,82,self._ctx) if la_ == 1: - self.state = 650 + self.state = 658 self.match(HogQLParser.SLASH) - self.state = 651 + self.state = 659 self.numberLiteral() @@ -4801,21 +4869,21 @@ def accept(self, visitor:ParseTreeVisitor): def settingExprList(self): localctx = HogQLParser.SettingExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 94, self.RULE_settingExprList) + self.enterRule(localctx, 96, self.RULE_settingExprList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 656 + self.state = 664 self.settingExpr() - self.state = 661 + self.state = 669 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==117: - self.state = 657 + while _la==119: + self.state = 665 self.match(HogQLParser.COMMA) - self.state = 658 + self.state = 666 self.settingExpr() - self.state = 663 + self.state = 671 self._errHandler.sync(self) _la = self._input.LA(1) @@ -4861,14 +4929,14 @@ def accept(self, visitor:ParseTreeVisitor): def settingExpr(self): localctx = HogQLParser.SettingExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 96, self.RULE_settingExpr) + self.enterRule(localctx, 98, self.RULE_settingExpr) try: self.enterOuterAlt(localctx, 1) - self.state = 664 + self.state = 672 self.identifier() - self.state = 665 + self.state = 673 self.match(HogQLParser.EQ_SINGLE) - self.state = 666 + self.state = 674 self.literal() except RecognitionException as re: localctx.exception = re @@ -4913,31 +4981,31 @@ def accept(self, visitor:ParseTreeVisitor): def windowExpr(self): localctx = HogQLParser.WindowExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 98, self.RULE_windowExpr) + self.enterRule(localctx, 100, self.RULE_windowExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 669 + self.state = 677 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==68: - self.state = 668 + if _la==70: + self.state = 676 self.winPartitionByClause() - self.state = 672 + self.state = 680 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==65: - self.state = 671 + if _la==67: + self.state = 679 self.winOrderByClause() - self.state = 675 + self.state = 683 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==72 or _la==77: - self.state = 674 + if _la==74 or _la==79: + self.state = 682 self.winFrameClause() @@ -4982,14 +5050,14 @@ def accept(self, visitor:ParseTreeVisitor): def winPartitionByClause(self): localctx = HogQLParser.WinPartitionByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 100, self.RULE_winPartitionByClause) + self.enterRule(localctx, 102, self.RULE_winPartitionByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 677 + self.state = 685 self.match(HogQLParser.PARTITION) - self.state = 678 + self.state = 686 self.match(HogQLParser.BY) - self.state = 679 + self.state = 687 self.columnExprList() except RecognitionException as re: localctx.exception = re @@ -5032,14 +5100,14 @@ def accept(self, visitor:ParseTreeVisitor): def winOrderByClause(self): localctx = HogQLParser.WinOrderByClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 102, self.RULE_winOrderByClause) + self.enterRule(localctx, 104, self.RULE_winOrderByClause) try: self.enterOuterAlt(localctx, 1) - self.state = 681 + self.state = 689 self.match(HogQLParser.ORDER) - self.state = 682 + self.state = 690 self.match(HogQLParser.BY) - self.state = 683 + self.state = 691 self.orderExprList() except RecognitionException as re: localctx.exception = re @@ -5082,18 +5150,18 @@ def accept(self, visitor:ParseTreeVisitor): def winFrameClause(self): localctx = HogQLParser.WinFrameClauseContext(self, self._ctx, self.state) - self.enterRule(localctx, 104, self.RULE_winFrameClause) + self.enterRule(localctx, 106, self.RULE_winFrameClause) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 685 + self.state = 693 _la = self._input.LA(1) - if not(_la==72 or _la==77): + if not(_la==74 or _la==79): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 686 + self.state = 694 self.winFrameExtend() except RecognitionException as re: localctx.exception = re @@ -5166,27 +5234,27 @@ def accept(self, visitor:ParseTreeVisitor): def winFrameExtend(self): localctx = HogQLParser.WinFrameExtendContext(self, self._ctx, self.state) - self.enterRule(localctx, 106, self.RULE_winFrameExtend) + self.enterRule(localctx, 108, self.RULE_winFrameExtend) try: - self.state = 694 + self.state = 702 self._errHandler.sync(self) token = self._input.LA(1) - if token in [19, 44, 58, 95, 107, 108, 109, 110, 119, 121, 140]: + if token in [19, 45, 60, 97, 109, 110, 111, 112, 121, 123, 142]: localctx = HogQLParser.FrameStartContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 688 + self.state = 696 self.winFrameBound() pass elif token in [9]: localctx = HogQLParser.FrameBetweenContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 689 + self.state = 697 self.match(HogQLParser.BETWEEN) - self.state = 690 + self.state = 698 self.winFrameBound() - self.state = 691 + self.state = 699 self.match(HogQLParser.AND) - self.state = 692 + self.state = 700 self.winFrameBound() pass else: @@ -5242,44 +5310,44 @@ def accept(self, visitor:ParseTreeVisitor): def winFrameBound(self): localctx = HogQLParser.WinFrameBoundContext(self, self._ctx, self.state) - self.enterRule(localctx, 108, self.RULE_winFrameBound) + self.enterRule(localctx, 110, self.RULE_winFrameBound) try: self.enterOuterAlt(localctx, 1) - self.state = 708 + self.state = 716 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,88,self._ctx) + la_ = self._interp.adaptivePredict(self._input,89,self._ctx) if la_ == 1: - self.state = 696 + self.state = 704 self.match(HogQLParser.CURRENT) - self.state = 697 + self.state = 705 self.match(HogQLParser.ROW) pass elif la_ == 2: - self.state = 698 + self.state = 706 self.match(HogQLParser.UNBOUNDED) - self.state = 699 + self.state = 707 self.match(HogQLParser.PRECEDING) pass elif la_ == 3: - self.state = 700 + self.state = 708 self.match(HogQLParser.UNBOUNDED) - self.state = 701 + self.state = 709 self.match(HogQLParser.FOLLOWING) pass elif la_ == 4: - self.state = 702 + self.state = 710 self.numberLiteral() - self.state = 703 + self.state = 711 self.match(HogQLParser.PRECEDING) pass elif la_ == 5: - self.state = 705 + self.state = 713 self.numberLiteral() - self.state = 706 + self.state = 714 self.match(HogQLParser.FOLLOWING) pass @@ -5322,12 +5390,12 @@ def accept(self, visitor:ParseTreeVisitor): def expr(self): localctx = HogQLParser.ExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 110, self.RULE_expr) + self.enterRule(localctx, 112, self.RULE_expr) try: self.enterOuterAlt(localctx, 1) - self.state = 710 + self.state = 718 self.columnExpr(0) - self.state = 711 + self.state = 719 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -5499,141 +5567,141 @@ def accept(self, visitor:ParseTreeVisitor): def columnTypeExpr(self): localctx = HogQLParser.ColumnTypeExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 112, self.RULE_columnTypeExpr) + self.enterRule(localctx, 114, self.RULE_columnTypeExpr) self._la = 0 # Token type try: - self.state = 769 + self.state = 777 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,96,self._ctx) + la_ = self._interp.adaptivePredict(self._input,97,self._ctx) if la_ == 1: localctx = HogQLParser.ColumnTypeExprSimpleContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 713 + self.state = 721 self.identifier() pass elif la_ == 2: localctx = HogQLParser.ColumnTypeExprNestedContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 714 + self.state = 722 self.identifier() - self.state = 715 + self.state = 723 self.match(HogQLParser.LPAREN) - self.state = 716 + self.state = 724 self.identifier() - self.state = 717 + self.state = 725 self.columnTypeExpr() - self.state = 724 + self.state = 732 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,89,self._ctx) + _alt = self._interp.adaptivePredict(self._input,90,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 718 + self.state = 726 self.match(HogQLParser.COMMA) - self.state = 719 + self.state = 727 self.identifier() - self.state = 720 + self.state = 728 self.columnTypeExpr() - self.state = 726 + self.state = 734 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,89,self._ctx) + _alt = self._interp.adaptivePredict(self._input,90,self._ctx) - self.state = 728 + self.state = 736 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 727 + if _la==119: + self.state = 735 self.match(HogQLParser.COMMA) - self.state = 730 + self.state = 738 self.match(HogQLParser.RPAREN) pass elif la_ == 3: localctx = HogQLParser.ColumnTypeExprEnumContext(self, localctx) self.enterOuterAlt(localctx, 3) - self.state = 732 + self.state = 740 self.identifier() - self.state = 733 + self.state = 741 self.match(HogQLParser.LPAREN) - self.state = 734 + self.state = 742 self.enumValue() - self.state = 739 + self.state = 747 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,91,self._ctx) + _alt = self._interp.adaptivePredict(self._input,92,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 735 + self.state = 743 self.match(HogQLParser.COMMA) - self.state = 736 + self.state = 744 self.enumValue() - self.state = 741 + self.state = 749 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,91,self._ctx) + _alt = self._interp.adaptivePredict(self._input,92,self._ctx) - self.state = 743 + self.state = 751 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 742 + if _la==119: + self.state = 750 self.match(HogQLParser.COMMA) - self.state = 745 + self.state = 753 self.match(HogQLParser.RPAREN) pass elif la_ == 4: localctx = HogQLParser.ColumnTypeExprComplexContext(self, localctx) self.enterOuterAlt(localctx, 4) - self.state = 747 + self.state = 755 self.identifier() - self.state = 748 + self.state = 756 self.match(HogQLParser.LPAREN) - self.state = 749 + self.state = 757 self.columnTypeExpr() - self.state = 754 + self.state = 762 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,93,self._ctx) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 750 + self.state = 758 self.match(HogQLParser.COMMA) - self.state = 751 + self.state = 759 self.columnTypeExpr() - self.state = 756 + self.state = 764 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,93,self._ctx) + _alt = self._interp.adaptivePredict(self._input,94,self._ctx) - self.state = 758 + self.state = 766 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 757 + if _la==119: + self.state = 765 self.match(HogQLParser.COMMA) - self.state = 760 + self.state = 768 self.match(HogQLParser.RPAREN) pass elif la_ == 5: localctx = HogQLParser.ColumnTypeExprParamContext(self, localctx) self.enterOuterAlt(localctx, 5) - self.state = 762 + self.state = 770 self.identifier() - self.state = 763 + self.state = 771 self.match(HogQLParser.LPAREN) - self.state = 765 + self.state = 773 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 764 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 772 self.columnExprList() - self.state = 767 + self.state = 775 self.match(HogQLParser.RPAREN) pass @@ -5682,29 +5750,29 @@ def accept(self, visitor:ParseTreeVisitor): def columnExprList(self): localctx = HogQLParser.ColumnExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 114, self.RULE_columnExprList) + self.enterRule(localctx, 116, self.RULE_columnExprList) try: self.enterOuterAlt(localctx, 1) - self.state = 771 + self.state = 779 self.columnExpr(0) - self.state = 776 + self.state = 784 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,97,self._ctx) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 772 + self.state = 780 self.match(HogQLParser.COMMA) - self.state = 773 + self.state = 781 self.columnExpr(0) - self.state = 778 + self.state = 786 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,97,self._ctx) + _alt = self._interp.adaptivePredict(self._input,98,self._ctx) - self.state = 780 + self.state = 788 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,98,self._ctx) + la_ = self._interp.adaptivePredict(self._input,99,self._ctx) if la_ == 1: - self.state = 779 + self.state = 787 self.match(HogQLParser.COMMA) @@ -5829,8 +5897,8 @@ def __init__(self, parser, ctx:ParserRuleContext): # actually a HogQLParser.Colu def LPAREN(self): return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def RPAREN(self): return self.getToken(HogQLParser.RPAREN, 0) @@ -6739,58 +6807,58 @@ def columnExpr(self, _p:int=0): _parentState = self.state localctx = HogQLParser.ColumnExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 116 - self.enterRecursionRule(localctx, 116, self.RULE_columnExpr, _p) + _startState = 118 + self.enterRecursionRule(localctx, 118, self.RULE_columnExpr, _p) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 932 + self.state = 940 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,118,self._ctx) + la_ = self._interp.adaptivePredict(self._input,119,self._ctx) if la_ == 1: localctx = HogQLParser.ColumnExprCaseContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 783 + self.state = 791 self.match(HogQLParser.CASE) - self.state = 785 + self.state = 793 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,99,self._ctx) + la_ = self._interp.adaptivePredict(self._input,100,self._ctx) if la_ == 1: - self.state = 784 + self.state = 792 localctx.caseExpr = self.columnExpr(0) - self.state = 792 + self.state = 800 self._errHandler.sync(self) _la = self._input.LA(1) while True: - self.state = 787 + self.state = 795 self.match(HogQLParser.WHEN) - self.state = 788 + self.state = 796 localctx.whenExpr = self.columnExpr(0) - self.state = 789 + self.state = 797 self.match(HogQLParser.THEN) - self.state = 790 + self.state = 798 localctx.thenExpr = self.columnExpr(0) - self.state = 794 + self.state = 802 self._errHandler.sync(self) _la = self._input.LA(1) - if not (_la==99): + if not (_la==101): break - self.state = 798 + self.state = 806 self._errHandler.sync(self) _la = self._input.LA(1) if _la==25: - self.state = 796 + self.state = 804 self.match(HogQLParser.ELSE) - self.state = 797 + self.state = 805 localctx.elseExpr = self.columnExpr(0) - self.state = 800 + self.state = 808 self.match(HogQLParser.END) pass @@ -6798,17 +6866,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprCastContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 802 + self.state = 810 self.match(HogQLParser.CAST) - self.state = 803 + self.state = 811 self.match(HogQLParser.LPAREN) - self.state = 804 + self.state = 812 self.columnExpr(0) - self.state = 805 + self.state = 813 self.match(HogQLParser.AS) - self.state = 806 + self.state = 814 self.columnTypeExpr() - self.state = 807 + self.state = 815 self.match(HogQLParser.RPAREN) pass @@ -6816,9 +6884,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprDateContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 809 + self.state = 817 self.match(HogQLParser.DATE) - self.state = 810 + self.state = 818 self.match(HogQLParser.STRING_LITERAL) pass @@ -6826,11 +6894,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprIntervalContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 811 + self.state = 819 self.match(HogQLParser.INTERVAL) - self.state = 812 + self.state = 820 self.columnExpr(0) - self.state = 813 + self.state = 821 self.interval() pass @@ -6838,27 +6906,27 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprSubstringContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 815 + self.state = 823 self.match(HogQLParser.SUBSTRING) - self.state = 816 + self.state = 824 self.match(HogQLParser.LPAREN) - self.state = 817 + self.state = 825 self.columnExpr(0) - self.state = 818 + self.state = 826 self.match(HogQLParser.FROM) - self.state = 819 + self.state = 827 self.columnExpr(0) - self.state = 822 + self.state = 830 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==33: - self.state = 820 + if _la==34: + self.state = 828 self.match(HogQLParser.FOR) - self.state = 821 + self.state = 829 self.columnExpr(0) - self.state = 824 + self.state = 832 self.match(HogQLParser.RPAREN) pass @@ -6866,9 +6934,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTimestampContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 826 + self.state = 834 self.match(HogQLParser.TIMESTAMP) - self.state = 827 + self.state = 835 self.match(HogQLParser.STRING_LITERAL) pass @@ -6876,24 +6944,24 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTrimContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 828 + self.state = 836 self.match(HogQLParser.TRIM) - self.state = 829 + self.state = 837 self.match(HogQLParser.LPAREN) - self.state = 830 + self.state = 838 _la = self._input.LA(1) - if not(_la==10 or _la==51 or _la==91): + if not(_la==10 or _la==53 or _la==93): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 831 + self.state = 839 self.string() - self.state = 832 + self.state = 840 self.match(HogQLParser.FROM) - self.state = 833 + self.state = 841 self.columnExpr(0) - self.state = 834 + self.state = 842 self.match(HogQLParser.RPAREN) pass @@ -6901,54 +6969,54 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprWinFunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 836 + self.state = 844 self.identifier() - self.state = 837 + self.state = 845 self.match(HogQLParser.LPAREN) - self.state = 839 + self.state = 847 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 838 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 846 localctx.columnExprs = self.columnExprList() - self.state = 841 + self.state = 849 self.match(HogQLParser.RPAREN) - self.state = 851 + self.state = 859 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==131: - self.state = 843 + if _la==133: + self.state = 851 self.match(HogQLParser.LPAREN) - self.state = 845 + self.state = 853 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,104,self._ctx) + la_ = self._interp.adaptivePredict(self._input,105,self._ctx) if la_ == 1: - self.state = 844 + self.state = 852 self.match(HogQLParser.DISTINCT) - self.state = 848 + self.state = 856 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 847 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 855 localctx.columnArgList = self.columnExprList() - self.state = 850 + self.state = 858 self.match(HogQLParser.RPAREN) - self.state = 853 + self.state = 861 self.match(HogQLParser.OVER) - self.state = 854 + self.state = 862 self.match(HogQLParser.LPAREN) - self.state = 855 + self.state = 863 self.windowExpr() - self.state = 856 + self.state = 864 self.match(HogQLParser.RPAREN) pass @@ -6956,50 +7024,50 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprWinFunctionTargetContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 858 + self.state = 866 self.identifier() - self.state = 859 + self.state = 867 self.match(HogQLParser.LPAREN) - self.state = 861 + self.state = 869 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 860 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 868 localctx.columnExprs = self.columnExprList() - self.state = 863 + self.state = 871 self.match(HogQLParser.RPAREN) - self.state = 873 + self.state = 881 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==131: - self.state = 865 + if _la==133: + self.state = 873 self.match(HogQLParser.LPAREN) - self.state = 867 + self.state = 875 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,108,self._ctx) + la_ = self._interp.adaptivePredict(self._input,109,self._ctx) if la_ == 1: - self.state = 866 + self.state = 874 self.match(HogQLParser.DISTINCT) - self.state = 870 + self.state = 878 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 869 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 877 localctx.columnArgList = self.columnExprList() - self.state = 872 + self.state = 880 self.match(HogQLParser.RPAREN) - self.state = 875 + self.state = 883 self.match(HogQLParser.OVER) - self.state = 876 + self.state = 884 self.identifier() pass @@ -7007,45 +7075,45 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprFunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 878 + self.state = 886 self.identifier() - self.state = 884 + self.state = 892 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,112,self._ctx) + la_ = self._interp.adaptivePredict(self._input,113,self._ctx) if la_ == 1: - self.state = 879 + self.state = 887 self.match(HogQLParser.LPAREN) - self.state = 881 + self.state = 889 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 880 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 888 localctx.columnExprs = self.columnExprList() - self.state = 883 + self.state = 891 self.match(HogQLParser.RPAREN) - self.state = 886 + self.state = 894 self.match(HogQLParser.LPAREN) - self.state = 888 + self.state = 896 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,113,self._ctx) + la_ = self._interp.adaptivePredict(self._input,114,self._ctx) if la_ == 1: - self.state = 887 + self.state = 895 self.match(HogQLParser.DISTINCT) - self.state = 891 + self.state = 899 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 890 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 898 localctx.columnArgList = self.columnExprList() - self.state = 893 + self.state = 901 self.match(HogQLParser.RPAREN) pass @@ -7053,7 +7121,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTagElementContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 895 + self.state = 903 self.hogqlxTagElement() pass @@ -7061,7 +7129,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTemplateStringContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 896 + self.state = 904 self.templateString() pass @@ -7069,7 +7137,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprLiteralContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 897 + self.state = 905 self.literal() pass @@ -7077,9 +7145,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprNegateContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 898 + self.state = 906 self.match(HogQLParser.DASH) - self.state = 899 + self.state = 907 self.columnExpr(20) pass @@ -7087,9 +7155,9 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprNotContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 900 + self.state = 908 self.match(HogQLParser.NOT) - self.state = 901 + self.state = 909 self.columnExpr(14) pass @@ -7097,17 +7165,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprAsteriskContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 905 + self.state = 913 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 902 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 910 self.tableIdentifier() - self.state = 903 + self.state = 911 self.match(HogQLParser.DOT) - self.state = 907 + self.state = 915 self.match(HogQLParser.ASTERISK) pass @@ -7115,11 +7183,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprSubqueryContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 908 + self.state = 916 self.match(HogQLParser.LPAREN) - self.state = 909 - self.selectUnionStmt() - self.state = 910 + self.state = 917 + self.selectSetStmt() + self.state = 918 self.match(HogQLParser.RPAREN) pass @@ -7127,11 +7195,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprParensContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 912 + self.state = 920 self.match(HogQLParser.LPAREN) - self.state = 913 + self.state = 921 self.columnExpr(0) - self.state = 914 + self.state = 922 self.match(HogQLParser.RPAREN) pass @@ -7139,11 +7207,11 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprTupleContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 916 + self.state = 924 self.match(HogQLParser.LPAREN) - self.state = 917 + self.state = 925 self.columnExprList() - self.state = 918 + self.state = 926 self.match(HogQLParser.RPAREN) pass @@ -7151,17 +7219,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprArrayContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 920 + self.state = 928 self.match(HogQLParser.LBRACKET) - self.state = 922 + self.state = 930 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 921 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 929 self.columnExprList() - self.state = 924 + self.state = 932 self.match(HogQLParser.RBRACKET) pass @@ -7169,17 +7237,17 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprDictContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 925 + self.state = 933 self.match(HogQLParser.LBRACE) - self.state = 927 + self.state = 935 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 926 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 934 self.kvPairList() - self.state = 929 + self.state = 937 self.match(HogQLParser.RBRACE) pass @@ -7187,7 +7255,7 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprLambdaContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 930 + self.state = 938 self.columnLambdaExpr() pass @@ -7195,50 +7263,50 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprIdentifierContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 931 + self.state = 939 self.columnIdentifier() pass self._ctx.stop = self._input.LT(-1) - self.state = 1044 + self.state = 1052 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,130,self._ctx) + _alt = self._interp.adaptivePredict(self._input,131,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: self.triggerExitRuleEvent() _prevctx = localctx - self.state = 1042 + self.state = 1050 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,129,self._ctx) + la_ = self._interp.adaptivePredict(self._input,130,self._ctx) if la_ == 1: localctx = HogQLParser.ColumnExprPrecedence1Context(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) localctx.left = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 934 + self.state = 942 if not self.precpred(self._ctx, 19): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 19)") - self.state = 938 + self.state = 946 self._errHandler.sync(self) token = self._input.LA(1) - if token in [113]: - self.state = 935 + if token in [115]: + self.state = 943 localctx.operator = self.match(HogQLParser.ASTERISK) pass - elif token in [152]: - self.state = 936 + elif token in [154]: + self.state = 944 localctx.operator = self.match(HogQLParser.SLASH) pass - elif token in [139]: - self.state = 937 + elif token in [141]: + self.state = 945 localctx.operator = self.match(HogQLParser.PERCENT) pass else: raise NoViableAltException(self) - self.state = 940 + self.state = 948 localctx.right = self.columnExpr(20) pass @@ -7246,29 +7314,29 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprPrecedence2Context(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) localctx.left = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 941 + self.state = 949 if not self.precpred(self._ctx, 18): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 18)") - self.state = 945 + self.state = 953 self._errHandler.sync(self) token = self._input.LA(1) - if token in [140]: - self.state = 942 + if token in [142]: + self.state = 950 localctx.operator = self.match(HogQLParser.PLUS) pass - elif token in [119]: - self.state = 943 + elif token in [121]: + self.state = 951 localctx.operator = self.match(HogQLParser.DASH) pass - elif token in [118]: - self.state = 944 + elif token in [120]: + self.state = 952 localctx.operator = self.match(HogQLParser.CONCAT) pass else: raise NoViableAltException(self) - self.state = 947 + self.state = 955 localctx.right = self.columnExpr(19) pass @@ -7276,81 +7344,81 @@ def columnExpr(self, _p:int=0): localctx = HogQLParser.ColumnExprPrecedence3Context(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) localctx.left = _prevctx self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 948 + self.state = 956 if not self.precpred(self._ctx, 17): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 17)") - self.state = 973 + self.state = 981 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,124,self._ctx) + la_ = self._interp.adaptivePredict(self._input,125,self._ctx) if la_ == 1: - self.state = 949 + self.state = 957 localctx.operator = self.match(HogQLParser.EQ_DOUBLE) pass elif la_ == 2: - self.state = 950 + self.state = 958 localctx.operator = self.match(HogQLParser.EQ_SINGLE) pass elif la_ == 3: - self.state = 951 + self.state = 959 localctx.operator = self.match(HogQLParser.NOT_EQ) pass elif la_ == 4: - self.state = 952 + self.state = 960 localctx.operator = self.match(HogQLParser.LT_EQ) pass elif la_ == 5: - self.state = 953 + self.state = 961 localctx.operator = self.match(HogQLParser.LT) pass elif la_ == 6: - self.state = 954 + self.state = 962 localctx.operator = self.match(HogQLParser.GT_EQ) pass elif la_ == 7: - self.state = 955 + self.state = 963 localctx.operator = self.match(HogQLParser.GT) pass elif la_ == 8: - self.state = 957 + self.state = 965 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 956 + if _la==61: + self.state = 964 localctx.operator = self.match(HogQLParser.NOT) - self.state = 959 + self.state = 967 self.match(HogQLParser.IN) - self.state = 961 + self.state = 969 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,122,self._ctx) + la_ = self._interp.adaptivePredict(self._input,123,self._ctx) if la_ == 1: - self.state = 960 + self.state = 968 self.match(HogQLParser.COHORT) pass elif la_ == 9: - self.state = 964 + self.state = 972 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 963 + if _la==61: + self.state = 971 localctx.operator = self.match(HogQLParser.NOT) - self.state = 966 + self.state = 974 _la = self._input.LA(1) - if not(_la==42 or _la==54): + if not(_la==43 or _la==56): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -7358,268 +7426,268 @@ def columnExpr(self, _p:int=0): pass elif la_ == 10: - self.state = 967 + self.state = 975 localctx.operator = self.match(HogQLParser.REGEX_SINGLE) pass elif la_ == 11: - self.state = 968 + self.state = 976 localctx.operator = self.match(HogQLParser.REGEX_DOUBLE) pass elif la_ == 12: - self.state = 969 + self.state = 977 localctx.operator = self.match(HogQLParser.NOT_REGEX) pass elif la_ == 13: - self.state = 970 + self.state = 978 localctx.operator = self.match(HogQLParser.IREGEX_SINGLE) pass elif la_ == 14: - self.state = 971 + self.state = 979 localctx.operator = self.match(HogQLParser.IREGEX_DOUBLE) pass elif la_ == 15: - self.state = 972 + self.state = 980 localctx.operator = self.match(HogQLParser.NOT_IREGEX) pass - self.state = 975 + self.state = 983 localctx.right = self.columnExpr(18) pass elif la_ == 4: localctx = HogQLParser.ColumnExprNullishContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 976 + self.state = 984 if not self.precpred(self._ctx, 15): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 15)") - self.state = 977 + self.state = 985 self.match(HogQLParser.NULLISH) - self.state = 978 + self.state = 986 self.columnExpr(16) pass elif la_ == 5: localctx = HogQLParser.ColumnExprAndContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 979 + self.state = 987 if not self.precpred(self._ctx, 13): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 13)") - self.state = 980 + self.state = 988 self.match(HogQLParser.AND) - self.state = 981 + self.state = 989 self.columnExpr(14) pass elif la_ == 6: localctx = HogQLParser.ColumnExprOrContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 982 + self.state = 990 if not self.precpred(self._ctx, 12): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 12)") - self.state = 983 + self.state = 991 self.match(HogQLParser.OR) - self.state = 984 + self.state = 992 self.columnExpr(13) pass elif la_ == 7: localctx = HogQLParser.ColumnExprBetweenContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 985 + self.state = 993 if not self.precpred(self._ctx, 11): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 11)") - self.state = 987 + self.state = 995 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 986 + if _la==61: + self.state = 994 self.match(HogQLParser.NOT) - self.state = 989 + self.state = 997 self.match(HogQLParser.BETWEEN) - self.state = 990 + self.state = 998 self.columnExpr(0) - self.state = 991 + self.state = 999 self.match(HogQLParser.AND) - self.state = 992 + self.state = 1000 self.columnExpr(12) pass elif la_ == 8: localctx = HogQLParser.ColumnExprTernaryOpContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 994 + self.state = 1002 if not self.precpred(self._ctx, 10): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 10)") - self.state = 995 + self.state = 1003 self.match(HogQLParser.QUERY) - self.state = 996 + self.state = 1004 self.columnExpr(0) - self.state = 997 + self.state = 1005 self.match(HogQLParser.COLON) - self.state = 998 + self.state = 1006 self.columnExpr(10) pass elif la_ == 9: localctx = HogQLParser.ColumnExprCallContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1000 + self.state = 1008 if not self.precpred(self._ctx, 30): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 30)") - self.state = 1001 + self.state = 1009 self.match(HogQLParser.LPAREN) - self.state = 1003 + self.state = 1011 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 1002 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 1010 self.columnExprList() - self.state = 1005 + self.state = 1013 self.match(HogQLParser.RPAREN) pass elif la_ == 10: localctx = HogQLParser.ColumnExprArrayAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1006 + self.state = 1014 if not self.precpred(self._ctx, 26): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 26)") - self.state = 1007 + self.state = 1015 self.match(HogQLParser.LBRACKET) - self.state = 1008 + self.state = 1016 self.columnExpr(0) - self.state = 1009 + self.state = 1017 self.match(HogQLParser.RBRACKET) pass elif la_ == 11: localctx = HogQLParser.ColumnExprTupleAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1011 + self.state = 1019 if not self.precpred(self._ctx, 25): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 25)") - self.state = 1012 + self.state = 1020 self.match(HogQLParser.DOT) - self.state = 1013 + self.state = 1021 self.match(HogQLParser.DECIMAL_LITERAL) pass elif la_ == 12: localctx = HogQLParser.ColumnExprPropertyAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1014 + self.state = 1022 if not self.precpred(self._ctx, 24): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 24)") - self.state = 1015 + self.state = 1023 self.match(HogQLParser.DOT) - self.state = 1016 + self.state = 1024 self.identifier() pass elif la_ == 13: localctx = HogQLParser.ColumnExprNullArrayAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1017 + self.state = 1025 if not self.precpred(self._ctx, 23): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 23)") - self.state = 1018 + self.state = 1026 self.match(HogQLParser.NULL_PROPERTY) - self.state = 1019 + self.state = 1027 self.match(HogQLParser.LBRACKET) - self.state = 1020 + self.state = 1028 self.columnExpr(0) - self.state = 1021 + self.state = 1029 self.match(HogQLParser.RBRACKET) pass elif la_ == 14: localctx = HogQLParser.ColumnExprNullTupleAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1023 + self.state = 1031 if not self.precpred(self._ctx, 22): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 22)") - self.state = 1024 + self.state = 1032 self.match(HogQLParser.NULL_PROPERTY) - self.state = 1025 + self.state = 1033 self.match(HogQLParser.DECIMAL_LITERAL) pass elif la_ == 15: localctx = HogQLParser.ColumnExprNullPropertyAccessContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1026 + self.state = 1034 if not self.precpred(self._ctx, 21): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 21)") - self.state = 1027 + self.state = 1035 self.match(HogQLParser.NULL_PROPERTY) - self.state = 1028 + self.state = 1036 self.identifier() pass elif la_ == 16: localctx = HogQLParser.ColumnExprIsNullContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1029 + self.state = 1037 if not self.precpred(self._ctx, 16): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 16)") - self.state = 1030 + self.state = 1038 self.match(HogQLParser.IS) - self.state = 1032 + self.state = 1040 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==59: - self.state = 1031 + if _la==61: + self.state = 1039 self.match(HogQLParser.NOT) - self.state = 1034 + self.state = 1042 self.match(HogQLParser.NULL_SQL) pass elif la_ == 17: localctx = HogQLParser.ColumnExprAliasContext(self, HogQLParser.ColumnExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_columnExpr) - self.state = 1035 + self.state = 1043 if not self.precpred(self._ctx, 9): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 9)") - self.state = 1040 + self.state = 1048 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,128,self._ctx) + la_ = self._interp.adaptivePredict(self._input,129,self._ctx) if la_ == 1: - self.state = 1036 + self.state = 1044 self.match(HogQLParser.AS) - self.state = 1037 + self.state = 1045 self.identifier() pass elif la_ == 2: - self.state = 1038 + self.state = 1046 self.match(HogQLParser.AS) - self.state = 1039 + self.state = 1047 self.match(HogQLParser.STRING_LITERAL) pass @@ -7627,9 +7695,9 @@ def columnExpr(self, _p:int=0): pass - self.state = 1046 + self.state = 1054 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,130,self._ctx) + _alt = self._interp.adaptivePredict(self._input,131,self._ctx) except RecognitionException as re: localctx.exception = re @@ -7692,89 +7760,89 @@ def accept(self, visitor:ParseTreeVisitor): def columnLambdaExpr(self): localctx = HogQLParser.ColumnLambdaExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 118, self.RULE_columnLambdaExpr) + self.enterRule(localctx, 120, self.RULE_columnLambdaExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1074 + self.state = 1082 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,135,self._ctx) + la_ = self._interp.adaptivePredict(self._input,136,self._ctx) if la_ == 1: - self.state = 1047 + self.state = 1055 self.match(HogQLParser.LPAREN) - self.state = 1048 + self.state = 1056 self.identifier() - self.state = 1053 + self.state = 1061 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,131,self._ctx) + _alt = self._interp.adaptivePredict(self._input,132,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1049 + self.state = 1057 self.match(HogQLParser.COMMA) - self.state = 1050 + self.state = 1058 self.identifier() - self.state = 1055 + self.state = 1063 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,131,self._ctx) + _alt = self._interp.adaptivePredict(self._input,132,self._ctx) - self.state = 1057 + self.state = 1065 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1056 + if _la==119: + self.state = 1064 self.match(HogQLParser.COMMA) - self.state = 1059 + self.state = 1067 self.match(HogQLParser.RPAREN) pass elif la_ == 2: - self.state = 1061 + self.state = 1069 self.identifier() - self.state = 1066 + self.state = 1074 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,133,self._ctx) + _alt = self._interp.adaptivePredict(self._input,134,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1062 + self.state = 1070 self.match(HogQLParser.COMMA) - self.state = 1063 + self.state = 1071 self.identifier() - self.state = 1068 + self.state = 1076 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,133,self._ctx) + _alt = self._interp.adaptivePredict(self._input,134,self._ctx) - self.state = 1070 + self.state = 1078 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1069 + if _la==119: + self.state = 1077 self.match(HogQLParser.COMMA) pass elif la_ == 3: - self.state = 1072 + self.state = 1080 self.match(HogQLParser.LPAREN) - self.state = 1073 + self.state = 1081 self.match(HogQLParser.RPAREN) pass - self.state = 1076 + self.state = 1084 self.match(HogQLParser.ARROW) - self.state = 1079 + self.state = 1087 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,136,self._ctx) + la_ = self._interp.adaptivePredict(self._input,137,self._ctx) if la_ == 1: - self.state = 1077 + self.state = 1085 self.columnExpr(0) pass elif la_ == 2: - self.state = 1078 + self.state = 1086 self.block() pass @@ -7886,77 +7954,77 @@ def accept(self, visitor:ParseTreeVisitor): def hogqlxTagElement(self): localctx = HogQLParser.HogqlxTagElementContext(self, self._ctx, self.state) - self.enterRule(localctx, 120, self.RULE_hogqlxTagElement) + self.enterRule(localctx, 122, self.RULE_hogqlxTagElement) self._la = 0 # Token type try: - self.state = 1113 + self.state = 1121 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,140,self._ctx) + la_ = self._interp.adaptivePredict(self._input,141,self._ctx) if la_ == 1: localctx = HogQLParser.HogqlxTagElementClosedContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1081 + self.state = 1089 self.match(HogQLParser.LT) - self.state = 1082 + self.state = 1090 self.identifier() - self.state = 1086 + self.state = 1094 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 1083 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 1091 self.hogqlxTagAttribute() - self.state = 1088 + self.state = 1096 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1089 + self.state = 1097 self.match(HogQLParser.SLASH) - self.state = 1090 + self.state = 1098 self.match(HogQLParser.GT) pass elif la_ == 2: localctx = HogQLParser.HogqlxTagElementNestedContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1092 + self.state = 1100 self.match(HogQLParser.LT) - self.state = 1093 + self.state = 1101 self.identifier() - self.state = 1097 + self.state = 1105 self._errHandler.sync(self) _la = self._input.LA(1) - while (((_la) & ~0x3f) == 0 and ((1 << _la) & -1450176743603191810) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 6458554974207) != 0): - self.state = 1094 + while (((_la) & ~0x3f) == 0 and ((1 << _la) & -5800812384855539714) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 25834219896831) != 0): + self.state = 1102 self.hogqlxTagAttribute() - self.state = 1099 + self.state = 1107 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1100 + self.state = 1108 self.match(HogQLParser.GT) - self.state = 1106 + self.state = 1114 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,139,self._ctx) + la_ = self._interp.adaptivePredict(self._input,140,self._ctx) if la_ == 1: - self.state = 1101 + self.state = 1109 self.hogqlxTagElement() elif la_ == 2: - self.state = 1102 + self.state = 1110 self.match(HogQLParser.LBRACE) - self.state = 1103 + self.state = 1111 self.columnExpr(0) - self.state = 1104 + self.state = 1112 self.match(HogQLParser.RBRACE) - self.state = 1108 + self.state = 1116 self.match(HogQLParser.LT) - self.state = 1109 + self.state = 1117 self.match(HogQLParser.SLASH) - self.state = 1110 + self.state = 1118 self.identifier() - self.state = 1111 + self.state = 1119 self.match(HogQLParser.GT) pass @@ -8013,38 +8081,38 @@ def accept(self, visitor:ParseTreeVisitor): def hogqlxTagAttribute(self): localctx = HogQLParser.HogqlxTagAttributeContext(self, self._ctx, self.state) - self.enterRule(localctx, 122, self.RULE_hogqlxTagAttribute) + self.enterRule(localctx, 124, self.RULE_hogqlxTagAttribute) try: - self.state = 1126 + self.state = 1134 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,141,self._ctx) + la_ = self._interp.adaptivePredict(self._input,142,self._ctx) if la_ == 1: self.enterOuterAlt(localctx, 1) - self.state = 1115 + self.state = 1123 self.identifier() - self.state = 1116 + self.state = 1124 self.match(HogQLParser.EQ_SINGLE) - self.state = 1117 + self.state = 1125 self.string() pass elif la_ == 2: self.enterOuterAlt(localctx, 2) - self.state = 1119 + self.state = 1127 self.identifier() - self.state = 1120 + self.state = 1128 self.match(HogQLParser.EQ_SINGLE) - self.state = 1121 + self.state = 1129 self.match(HogQLParser.LBRACE) - self.state = 1122 + self.state = 1130 self.columnExpr(0) - self.state = 1123 + self.state = 1131 self.match(HogQLParser.RBRACE) pass elif la_ == 3: self.enterOuterAlt(localctx, 3) - self.state = 1125 + self.state = 1133 self.identifier() pass @@ -8093,30 +8161,30 @@ def accept(self, visitor:ParseTreeVisitor): def withExprList(self): localctx = HogQLParser.WithExprListContext(self, self._ctx, self.state) - self.enterRule(localctx, 124, self.RULE_withExprList) + self.enterRule(localctx, 126, self.RULE_withExprList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1128 + self.state = 1136 self.withExpr() - self.state = 1133 + self.state = 1141 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,142,self._ctx) + _alt = self._interp.adaptivePredict(self._input,143,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1129 + self.state = 1137 self.match(HogQLParser.COMMA) - self.state = 1130 + self.state = 1138 self.withExpr() - self.state = 1135 + self.state = 1143 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,142,self._ctx) + _alt = self._interp.adaptivePredict(self._input,143,self._ctx) - self.state = 1137 + self.state = 1145 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1136 + if _la==119: + self.state = 1144 self.match(HogQLParser.COMMA) @@ -8181,8 +8249,8 @@ def AS(self): return self.getToken(HogQLParser.AS, 0) def LPAREN(self): return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def RPAREN(self): return self.getToken(HogQLParser.RPAREN, 0) @@ -8198,34 +8266,34 @@ def accept(self, visitor:ParseTreeVisitor): def withExpr(self): localctx = HogQLParser.WithExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 126, self.RULE_withExpr) + self.enterRule(localctx, 128, self.RULE_withExpr) try: - self.state = 1149 + self.state = 1157 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,144,self._ctx) + la_ = self._interp.adaptivePredict(self._input,145,self._ctx) if la_ == 1: localctx = HogQLParser.WithExprSubqueryContext(self, localctx) self.enterOuterAlt(localctx, 1) - self.state = 1139 + self.state = 1147 self.identifier() - self.state = 1140 + self.state = 1148 self.match(HogQLParser.AS) - self.state = 1141 + self.state = 1149 self.match(HogQLParser.LPAREN) - self.state = 1142 - self.selectUnionStmt() - self.state = 1143 + self.state = 1150 + self.selectSetStmt() + self.state = 1151 self.match(HogQLParser.RPAREN) pass elif la_ == 2: localctx = HogQLParser.WithExprColumnContext(self, localctx) self.enterOuterAlt(localctx, 2) - self.state = 1145 + self.state = 1153 self.columnExpr(0) - self.state = 1146 + self.state = 1154 self.match(HogQLParser.AS) - self.state = 1147 + self.state = 1155 self.identifier() pass @@ -8276,29 +8344,29 @@ def accept(self, visitor:ParseTreeVisitor): def columnIdentifier(self): localctx = HogQLParser.ColumnIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 128, self.RULE_columnIdentifier) + self.enterRule(localctx, 130, self.RULE_columnIdentifier) try: - self.state = 1158 + self.state = 1166 self._errHandler.sync(self) token = self._input.LA(1) - if token in [129]: + if token in [131]: self.enterOuterAlt(localctx, 1) - self.state = 1151 + self.state = 1159 self.placeholder() pass - elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 37, 38, 39, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 56, 57, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 98, 99, 100, 102, 103, 104, 106]: + elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 28, 29, 31, 33, 34, 35, 36, 38, 39, 40, 41, 42, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 58, 59, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 100, 101, 102, 104, 105, 106, 108]: self.enterOuterAlt(localctx, 2) - self.state = 1155 + self.state = 1163 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,145,self._ctx) + la_ = self._interp.adaptivePredict(self._input,146,self._ctx) if la_ == 1: - self.state = 1152 + self.state = 1160 self.tableIdentifier() - self.state = 1153 + self.state = 1161 self.match(HogQLParser.DOT) - self.state = 1157 + self.state = 1165 self.nestedIdentifier() pass else: @@ -8348,23 +8416,23 @@ def accept(self, visitor:ParseTreeVisitor): def nestedIdentifier(self): localctx = HogQLParser.NestedIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 130, self.RULE_nestedIdentifier) + self.enterRule(localctx, 132, self.RULE_nestedIdentifier) try: self.enterOuterAlt(localctx, 1) - self.state = 1160 + self.state = 1168 self.identifier() - self.state = 1165 + self.state = 1173 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,147,self._ctx) + _alt = self._interp.adaptivePredict(self._input,148,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1161 + self.state = 1169 self.match(HogQLParser.DOT) - self.state = 1162 + self.state = 1170 self.identifier() - self.state = 1167 + self.state = 1175 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,147,self._ctx) + _alt = self._interp.adaptivePredict(self._input,148,self._ctx) except RecognitionException as re: localctx.exception = re @@ -8450,8 +8518,8 @@ def __init__(self, parser, ctx:ParserRuleContext): # actually a HogQLParser.Tabl def LPAREN(self): return self.getToken(HogQLParser.LPAREN, 0) - def selectUnionStmt(self): - return self.getTypedRuleContext(HogQLParser.SelectUnionStmtContext,0) + def selectSetStmt(self): + return self.getTypedRuleContext(HogQLParser.SelectSetStmtContext,0) def RPAREN(self): return self.getToken(HogQLParser.RPAREN, 0) @@ -8511,19 +8579,19 @@ def tableExpr(self, _p:int=0): _parentState = self.state localctx = HogQLParser.TableExprContext(self, self._ctx, _parentState) _prevctx = localctx - _startState = 132 - self.enterRecursionRule(localctx, 132, self.RULE_tableExpr, _p) + _startState = 134 + self.enterRecursionRule(localctx, 134, self.RULE_tableExpr, _p) try: self.enterOuterAlt(localctx, 1) - self.state = 1177 + self.state = 1185 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,148,self._ctx) + la_ = self._interp.adaptivePredict(self._input,149,self._ctx) if la_ == 1: localctx = HogQLParser.TableExprIdentifierContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1169 + self.state = 1177 self.tableIdentifier() pass @@ -8531,7 +8599,7 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprFunctionContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1170 + self.state = 1178 self.tableFunctionExpr() pass @@ -8539,11 +8607,11 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprSubqueryContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1171 + self.state = 1179 self.match(HogQLParser.LPAREN) - self.state = 1172 - self.selectUnionStmt() - self.state = 1173 + self.state = 1180 + self.selectSetStmt() + self.state = 1181 self.match(HogQLParser.RPAREN) pass @@ -8551,7 +8619,7 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprTagContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1175 + self.state = 1183 self.hogqlxTagElement() pass @@ -8559,15 +8627,15 @@ def tableExpr(self, _p:int=0): localctx = HogQLParser.TableExprPlaceholderContext(self, localctx) self._ctx = localctx _prevctx = localctx - self.state = 1176 + self.state = 1184 self.placeholder() pass self._ctx.stop = self._input.LT(-1) - self.state = 1187 + self.state = 1195 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,150,self._ctx) + _alt = self._interp.adaptivePredict(self._input,151,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: if self._parseListeners is not None: @@ -8575,29 +8643,29 @@ def tableExpr(self, _p:int=0): _prevctx = localctx localctx = HogQLParser.TableExprAliasContext(self, HogQLParser.TableExprContext(self, _parentctx, _parentState)) self.pushNewRecursionContext(localctx, _startState, self.RULE_tableExpr) - self.state = 1179 + self.state = 1187 if not self.precpred(self._ctx, 3): from antlr4.error.Errors import FailedPredicateException raise FailedPredicateException(self, "self.precpred(self._ctx, 3)") - self.state = 1183 + self.state = 1191 self._errHandler.sync(self) token = self._input.LA(1) - if token in [20, 30, 40, 49, 106]: - self.state = 1180 + if token in [20, 31, 41, 51, 108]: + self.state = 1188 self.alias() pass elif token in [6]: - self.state = 1181 + self.state = 1189 self.match(HogQLParser.AS) - self.state = 1182 + self.state = 1190 self.identifier() pass else: raise NoViableAltException(self) - self.state = 1189 + self.state = 1197 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,150,self._ctx) + _alt = self._interp.adaptivePredict(self._input,151,self._ctx) except RecognitionException as re: localctx.exception = re @@ -8644,23 +8712,23 @@ def accept(self, visitor:ParseTreeVisitor): def tableFunctionExpr(self): localctx = HogQLParser.TableFunctionExprContext(self, self._ctx, self.state) - self.enterRule(localctx, 134, self.RULE_tableFunctionExpr) + self.enterRule(localctx, 136, self.RULE_tableFunctionExpr) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1190 + self.state = 1198 self.identifier() - self.state = 1191 + self.state = 1199 self.match(HogQLParser.LPAREN) - self.state = 1193 + self.state = 1201 self._errHandler.sync(self) _la = self._input.LA(1) - if (((_la) & ~0x3f) == 0 and ((1 << _la) & -9007270658588674) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 180986072486903807) != 0) or ((((_la - 129)) & ~0x3f) == 0 and ((1 << (_la - 129)) & 18455) != 0): - self.state = 1192 + if (((_la) & ~0x3f) == 0 and ((1 << _la) & -36169677449216002) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 723944289947615231) != 0) or ((((_la - 131)) & ~0x3f) == 0 and ((1 << (_la - 131)) & 18455) != 0): + self.state = 1200 self.tableArgList() - self.state = 1195 + self.state = 1203 self.match(HogQLParser.RPAREN) except RecognitionException as re: localctx.exception = re @@ -8704,20 +8772,20 @@ def accept(self, visitor:ParseTreeVisitor): def tableIdentifier(self): localctx = HogQLParser.TableIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 136, self.RULE_tableIdentifier) + self.enterRule(localctx, 138, self.RULE_tableIdentifier) try: self.enterOuterAlt(localctx, 1) - self.state = 1200 + self.state = 1208 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,152,self._ctx) + la_ = self._interp.adaptivePredict(self._input,153,self._ctx) if la_ == 1: - self.state = 1197 + self.state = 1205 self.databaseIdentifier() - self.state = 1198 + self.state = 1206 self.match(HogQLParser.DOT) - self.state = 1202 + self.state = 1210 self.identifier() except RecognitionException as re: localctx.exception = re @@ -8763,30 +8831,30 @@ def accept(self, visitor:ParseTreeVisitor): def tableArgList(self): localctx = HogQLParser.TableArgListContext(self, self._ctx, self.state) - self.enterRule(localctx, 138, self.RULE_tableArgList) + self.enterRule(localctx, 140, self.RULE_tableArgList) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1204 + self.state = 1212 self.columnExpr(0) - self.state = 1209 + self.state = 1217 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,153,self._ctx) + _alt = self._interp.adaptivePredict(self._input,154,self._ctx) while _alt!=2 and _alt!=ATN.INVALID_ALT_NUMBER: if _alt==1: - self.state = 1205 + self.state = 1213 self.match(HogQLParser.COMMA) - self.state = 1206 + self.state = 1214 self.columnExpr(0) - self.state = 1211 + self.state = 1219 self._errHandler.sync(self) - _alt = self._interp.adaptivePredict(self._input,153,self._ctx) + _alt = self._interp.adaptivePredict(self._input,154,self._ctx) - self.state = 1213 + self.state = 1221 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==117: - self.state = 1212 + if _la==119: + self.state = 1220 self.match(HogQLParser.COMMA) @@ -8825,10 +8893,10 @@ def accept(self, visitor:ParseTreeVisitor): def databaseIdentifier(self): localctx = HogQLParser.DatabaseIdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 140, self.RULE_databaseIdentifier) + self.enterRule(localctx, 142, self.RULE_databaseIdentifier) try: self.enterOuterAlt(localctx, 1) - self.state = 1215 + self.state = 1223 self.identifier() except RecognitionException as re: localctx.exception = re @@ -8876,42 +8944,42 @@ def accept(self, visitor:ParseTreeVisitor): def floatingLiteral(self): localctx = HogQLParser.FloatingLiteralContext(self, self._ctx, self.state) - self.enterRule(localctx, 142, self.RULE_floatingLiteral) + self.enterRule(localctx, 144, self.RULE_floatingLiteral) self._la = 0 # Token type try: - self.state = 1225 + self.state = 1233 self._errHandler.sync(self) token = self._input.LA(1) - if token in [107]: + if token in [109]: self.enterOuterAlt(localctx, 1) - self.state = 1217 + self.state = 1225 self.match(HogQLParser.FLOATING_LITERAL) pass - elif token in [121]: + elif token in [123]: self.enterOuterAlt(localctx, 2) - self.state = 1218 + self.state = 1226 self.match(HogQLParser.DOT) - self.state = 1219 + self.state = 1227 _la = self._input.LA(1) - if not(_la==108 or _la==109): + if not(_la==110 or _la==111): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() pass - elif token in [109]: + elif token in [111]: self.enterOuterAlt(localctx, 3) - self.state = 1220 + self.state = 1228 self.match(HogQLParser.DECIMAL_LITERAL) - self.state = 1221 + self.state = 1229 self.match(HogQLParser.DOT) - self.state = 1223 + self.state = 1231 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,155,self._ctx) + la_ = self._interp.adaptivePredict(self._input,156,self._ctx) if la_ == 1: - self.state = 1222 + self.state = 1230 _la = self._input.LA(1) - if not(_la==108 or _la==109): + if not(_la==110 or _la==111): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -8978,53 +9046,53 @@ def accept(self, visitor:ParseTreeVisitor): def numberLiteral(self): localctx = HogQLParser.NumberLiteralContext(self, self._ctx, self.state) - self.enterRule(localctx, 144, self.RULE_numberLiteral) + self.enterRule(localctx, 146, self.RULE_numberLiteral) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1228 + self.state = 1236 self._errHandler.sync(self) _la = self._input.LA(1) - if _la==119 or _la==140: - self.state = 1227 + if _la==121 or _la==142: + self.state = 1235 _la = self._input.LA(1) - if not(_la==119 or _la==140): + if not(_la==121 or _la==142): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) self.consume() - self.state = 1236 + self.state = 1244 self._errHandler.sync(self) - la_ = self._interp.adaptivePredict(self._input,158,self._ctx) + la_ = self._interp.adaptivePredict(self._input,159,self._ctx) if la_ == 1: - self.state = 1230 + self.state = 1238 self.floatingLiteral() pass elif la_ == 2: - self.state = 1231 + self.state = 1239 self.match(HogQLParser.OCTAL_LITERAL) pass elif la_ == 3: - self.state = 1232 + self.state = 1240 self.match(HogQLParser.DECIMAL_LITERAL) pass elif la_ == 4: - self.state = 1233 + self.state = 1241 self.match(HogQLParser.HEXADECIMAL_LITERAL) pass elif la_ == 5: - self.state = 1234 + self.state = 1242 self.match(HogQLParser.INF) pass elif la_ == 6: - self.state = 1235 + self.state = 1243 self.match(HogQLParser.NAN_SQL) pass @@ -9070,24 +9138,24 @@ def accept(self, visitor:ParseTreeVisitor): def literal(self): localctx = HogQLParser.LiteralContext(self, self._ctx, self.state) - self.enterRule(localctx, 146, self.RULE_literal) + self.enterRule(localctx, 148, self.RULE_literal) try: - self.state = 1241 + self.state = 1249 self._errHandler.sync(self) token = self._input.LA(1) - if token in [44, 58, 107, 108, 109, 110, 119, 121, 140]: + if token in [45, 60, 109, 110, 111, 112, 121, 123, 142]: self.enterOuterAlt(localctx, 1) - self.state = 1238 + self.state = 1246 self.numberLiteral() pass - elif token in [111]: + elif token in [113]: self.enterOuterAlt(localctx, 2) - self.state = 1239 + self.state = 1247 self.match(HogQLParser.STRING_LITERAL) pass - elif token in [60]: + elif token in [62]: self.enterOuterAlt(localctx, 3) - self.state = 1240 + self.state = 1248 self.match(HogQLParser.NULL_SQL) pass else: @@ -9148,13 +9216,13 @@ def accept(self, visitor:ParseTreeVisitor): def interval(self): localctx = HogQLParser.IntervalContext(self, self._ctx, self.state) - self.enterRule(localctx, 148, self.RULE_interval) + self.enterRule(localctx, 150, self.RULE_interval) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1243 + self.state = 1251 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 216173331871694848) != 0) or ((((_la - 71)) & ~0x3f) == 0 and ((1 << (_la - 71)) & 8724152577) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 864692227968860160) != 0) or ((((_la - 73)) & ~0x3f) == 0 and ((1 << (_la - 73)) & 8724152577) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -9445,13 +9513,13 @@ def accept(self, visitor:ParseTreeVisitor): def keyword(self): localctx = HogQLParser.KeywordContext(self, self._ctx, self.state) - self.enterRule(localctx, 150, self.RULE_keyword) + self.enterRule(localctx, 152, self.RULE_keyword) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1245 + self.state = 1253 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -1666350075474886658) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 943816933247) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & -6665504612824399874) != 0) or ((((_la - 64)) & ~0x3f) == 0 and ((1 << (_la - 64)) & 3775267732991) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -9499,13 +9567,13 @@ def accept(self, visitor:ParseTreeVisitor): def keywordForAlias(self): localctx = HogQLParser.KeywordForAliasContext(self, self._ctx, self.state) - self.enterRule(localctx, 152, self.RULE_keywordForAlias) + self.enterRule(localctx, 154, self.RULE_keywordForAlias) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1247 + self.state = 1255 _la = self._input.LA(1) - if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 564050539839488) != 0)): + if not((((_la) & ~0x3f) == 0 and ((1 << _la) & 2254000985473024) != 0)): self._errHandler.recoverInline(self) else: self._errHandler.reportMatch(self) @@ -9548,19 +9616,19 @@ def accept(self, visitor:ParseTreeVisitor): def alias(self): localctx = HogQLParser.AliasContext(self, self._ctx, self.state) - self.enterRule(localctx, 154, self.RULE_alias) + self.enterRule(localctx, 156, self.RULE_alias) try: - self.state = 1251 + self.state = 1259 self._errHandler.sync(self) token = self._input.LA(1) - if token in [106]: + if token in [108]: self.enterOuterAlt(localctx, 1) - self.state = 1249 + self.state = 1257 self.match(HogQLParser.IDENTIFIER) pass - elif token in [20, 30, 40, 49]: + elif token in [20, 31, 41, 51]: self.enterOuterAlt(localctx, 2) - self.state = 1250 + self.state = 1258 self.keywordForAlias() pass else: @@ -9608,24 +9676,24 @@ def accept(self, visitor:ParseTreeVisitor): def identifier(self): localctx = HogQLParser.IdentifierContext(self, self._ctx, self.state) - self.enterRule(localctx, 156, self.RULE_identifier) + self.enterRule(localctx, 158, self.RULE_identifier) try: - self.state = 1256 + self.state = 1264 self._errHandler.sync(self) token = self._input.LA(1) - if token in [106]: + if token in [108]: self.enterOuterAlt(localctx, 1) - self.state = 1253 + self.state = 1261 self.match(HogQLParser.IDENTIFIER) pass - elif token in [21, 39, 56, 57, 71, 79, 98, 104]: + elif token in [21, 40, 58, 59, 73, 81, 100, 106]: self.enterOuterAlt(localctx, 2) - self.state = 1254 + self.state = 1262 self.interval() pass - elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 27, 28, 30, 32, 33, 34, 35, 37, 38, 40, 41, 42, 43, 45, 46, 47, 48, 49, 50, 51, 52, 54, 55, 59, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 72, 73, 74, 75, 76, 77, 78, 80, 81, 82, 83, 84, 86, 87, 88, 89, 90, 91, 92, 93, 95, 96, 97, 99, 100, 102, 103]: + elif token in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 22, 23, 24, 25, 26, 28, 29, 31, 33, 34, 35, 36, 38, 39, 41, 42, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 56, 57, 61, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 74, 75, 76, 77, 78, 79, 80, 82, 83, 84, 85, 86, 88, 89, 90, 91, 92, 93, 94, 95, 97, 98, 99, 101, 102, 104, 105]: self.enterOuterAlt(localctx, 3) - self.state = 1255 + self.state = 1263 self.keyword() pass else: @@ -9673,14 +9741,14 @@ def accept(self, visitor:ParseTreeVisitor): def enumValue(self): localctx = HogQLParser.EnumValueContext(self, self._ctx, self.state) - self.enterRule(localctx, 158, self.RULE_enumValue) + self.enterRule(localctx, 160, self.RULE_enumValue) try: self.enterOuterAlt(localctx, 1) - self.state = 1258 + self.state = 1266 self.string() - self.state = 1259 + self.state = 1267 self.match(HogQLParser.EQ_SINGLE) - self.state = 1260 + self.state = 1268 self.numberLiteral() except RecognitionException as re: localctx.exception = re @@ -9723,14 +9791,14 @@ def accept(self, visitor:ParseTreeVisitor): def placeholder(self): localctx = HogQLParser.PlaceholderContext(self, self._ctx, self.state) - self.enterRule(localctx, 160, self.RULE_placeholder) + self.enterRule(localctx, 162, self.RULE_placeholder) try: self.enterOuterAlt(localctx, 1) - self.state = 1262 + self.state = 1270 self.match(HogQLParser.LBRACE) - self.state = 1263 + self.state = 1271 self.columnExpr(0) - self.state = 1264 + self.state = 1272 self.match(HogQLParser.RBRACE) except RecognitionException as re: localctx.exception = re @@ -9770,19 +9838,19 @@ def accept(self, visitor:ParseTreeVisitor): def string(self): localctx = HogQLParser.StringContext(self, self._ctx, self.state) - self.enterRule(localctx, 162, self.RULE_string) + self.enterRule(localctx, 164, self.RULE_string) try: - self.state = 1268 + self.state = 1276 self._errHandler.sync(self) token = self._input.LA(1) - if token in [111]: + if token in [113]: self.enterOuterAlt(localctx, 1) - self.state = 1266 + self.state = 1274 self.match(HogQLParser.STRING_LITERAL) pass - elif token in [143]: + elif token in [145]: self.enterOuterAlt(localctx, 2) - self.state = 1267 + self.state = 1275 self.templateString() pass else: @@ -9832,23 +9900,23 @@ def accept(self, visitor:ParseTreeVisitor): def templateString(self): localctx = HogQLParser.TemplateStringContext(self, self._ctx, self.state) - self.enterRule(localctx, 164, self.RULE_templateString) + self.enterRule(localctx, 166, self.RULE_templateString) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1270 + self.state = 1278 self.match(HogQLParser.QUOTE_SINGLE_TEMPLATE) - self.state = 1274 + self.state = 1282 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==157 or _la==158: - self.state = 1271 + while _la==159 or _la==160: + self.state = 1279 self.stringContents() - self.state = 1276 + self.state = 1284 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1277 + self.state = 1285 self.match(HogQLParser.QUOTE_SINGLE) except RecognitionException as re: localctx.exception = re @@ -9894,23 +9962,23 @@ def accept(self, visitor:ParseTreeVisitor): def stringContents(self): localctx = HogQLParser.StringContentsContext(self, self._ctx, self.state) - self.enterRule(localctx, 166, self.RULE_stringContents) + self.enterRule(localctx, 168, self.RULE_stringContents) try: - self.state = 1284 + self.state = 1292 self._errHandler.sync(self) token = self._input.LA(1) - if token in [158]: + if token in [160]: self.enterOuterAlt(localctx, 1) - self.state = 1279 + self.state = 1287 self.match(HogQLParser.STRING_ESCAPE_TRIGGER) - self.state = 1280 + self.state = 1288 self.columnExpr(0) - self.state = 1281 + self.state = 1289 self.match(HogQLParser.RBRACE) pass - elif token in [157]: + elif token in [159]: self.enterOuterAlt(localctx, 2) - self.state = 1283 + self.state = 1291 self.match(HogQLParser.STRING_TEXT) pass else: @@ -9960,23 +10028,23 @@ def accept(self, visitor:ParseTreeVisitor): def fullTemplateString(self): localctx = HogQLParser.FullTemplateStringContext(self, self._ctx, self.state) - self.enterRule(localctx, 168, self.RULE_fullTemplateString) + self.enterRule(localctx, 170, self.RULE_fullTemplateString) self._la = 0 # Token type try: self.enterOuterAlt(localctx, 1) - self.state = 1286 + self.state = 1294 self.match(HogQLParser.QUOTE_SINGLE_TEMPLATE_FULL) - self.state = 1290 + self.state = 1298 self._errHandler.sync(self) _la = self._input.LA(1) - while _la==159 or _la==160: - self.state = 1287 + while _la==161 or _la==162: + self.state = 1295 self.stringContentsFull() - self.state = 1292 + self.state = 1300 self._errHandler.sync(self) _la = self._input.LA(1) - self.state = 1293 + self.state = 1301 self.match(HogQLParser.EOF) except RecognitionException as re: localctx.exception = re @@ -10022,23 +10090,23 @@ def accept(self, visitor:ParseTreeVisitor): def stringContentsFull(self): localctx = HogQLParser.StringContentsFullContext(self, self._ctx, self.state) - self.enterRule(localctx, 170, self.RULE_stringContentsFull) + self.enterRule(localctx, 172, self.RULE_stringContentsFull) try: - self.state = 1300 + self.state = 1308 self._errHandler.sync(self) token = self._input.LA(1) - if token in [160]: + if token in [162]: self.enterOuterAlt(localctx, 1) - self.state = 1295 + self.state = 1303 self.match(HogQLParser.FULL_STRING_ESCAPE_TRIGGER) - self.state = 1296 + self.state = 1304 self.columnExpr(0) - self.state = 1297 + self.state = 1305 self.match(HogQLParser.RBRACE) pass - elif token in [159]: + elif token in [161]: self.enterOuterAlt(localctx, 2) - self.state = 1299 + self.state = 1307 self.match(HogQLParser.FULL_STRING_TEXT) pass else: @@ -10057,9 +10125,9 @@ def stringContentsFull(self): def sempred(self, localctx:RuleContext, ruleIndex:int, predIndex:int): if self._predicates == None: self._predicates = dict() - self._predicates[39] = self.joinExpr_sempred - self._predicates[58] = self.columnExpr_sempred - self._predicates[66] = self.tableExpr_sempred + self._predicates[40] = self.joinExpr_sempred + self._predicates[59] = self.columnExpr_sempred + self._predicates[67] = self.tableExpr_sempred pred = self._predicates.get(ruleIndex, None) if pred is None: raise Exception("No predicate with index:" + str(ruleIndex)) diff --git a/posthog/hogql/grammar/HogQLParser.tokens b/posthog/hogql/grammar/HogQLParser.tokens index 8658dc473b899..f370b819d5a0d 100644 --- a/posthog/hogql/grammar/HogQLParser.tokens +++ b/posthog/hogql/grammar/HogQLParser.tokens @@ -24,178 +24,180 @@ DESCENDING=23 DISTINCT=24 ELSE=25 END=26 -EXTRACT=27 -FINAL=28 -FINALLY=29 -FIRST=30 -FN=31 -FOLLOWING=32 -FOR=33 -FROM=34 -FULL=35 -FUN=36 -GROUP=37 -HAVING=38 -HOUR=39 -ID=40 -IF=41 -ILIKE=42 -IN=43 -INF=44 -INNER=45 -INTERVAL=46 -IS=47 -JOIN=48 -KEY=49 -LAST=50 -LEADING=51 -LEFT=52 -LET=53 -LIKE=54 -LIMIT=55 -MINUTE=56 -MONTH=57 -NAN_SQL=58 -NOT=59 -NULL_SQL=60 -NULLS=61 -OFFSET=62 -ON=63 -OR=64 -ORDER=65 -OUTER=66 -OVER=67 -PARTITION=68 -PRECEDING=69 -PREWHERE=70 -QUARTER=71 -RANGE=72 -RETURN=73 -RIGHT=74 -ROLLUP=75 -ROW=76 -ROWS=77 -SAMPLE=78 -SECOND=79 -SELECT=80 -SEMI=81 -SETTINGS=82 -SUBSTRING=83 -THEN=84 -THROW=85 -TIES=86 -TIMESTAMP=87 -TO=88 -TOP=89 -TOTALS=90 -TRAILING=91 -TRIM=92 -TRUNCATE=93 -TRY=94 -UNBOUNDED=95 -UNION=96 -USING=97 -WEEK=98 -WHEN=99 -WHERE=100 -WHILE=101 -WINDOW=102 -WITH=103 -YEAR=104 -ESCAPE_CHAR_COMMON=105 -IDENTIFIER=106 -FLOATING_LITERAL=107 -OCTAL_LITERAL=108 -DECIMAL_LITERAL=109 -HEXADECIMAL_LITERAL=110 -STRING_LITERAL=111 -ARROW=112 -ASTERISK=113 -BACKQUOTE=114 -BACKSLASH=115 -COLON=116 -COMMA=117 -CONCAT=118 -DASH=119 -DOLLAR=120 -DOT=121 -EQ_DOUBLE=122 -EQ_SINGLE=123 -GT_EQ=124 -GT=125 -HASH=126 -IREGEX_SINGLE=127 -IREGEX_DOUBLE=128 -LBRACE=129 -LBRACKET=130 -LPAREN=131 -LT_EQ=132 -LT=133 -NOT_EQ=134 -NOT_IREGEX=135 -NOT_REGEX=136 -NULL_PROPERTY=137 -NULLISH=138 -PERCENT=139 -PLUS=140 -QUERY=141 -QUOTE_DOUBLE=142 -QUOTE_SINGLE_TEMPLATE=143 -QUOTE_SINGLE_TEMPLATE_FULL=144 -QUOTE_SINGLE=145 -REGEX_SINGLE=146 -REGEX_DOUBLE=147 -RBRACE=148 -RBRACKET=149 -RPAREN=150 -SEMICOLON=151 -SLASH=152 -UNDERSCORE=153 -MULTI_LINE_COMMENT=154 -SINGLE_LINE_COMMENT=155 -WHITESPACE=156 -STRING_TEXT=157 -STRING_ESCAPE_TRIGGER=158 -FULL_STRING_TEXT=159 -FULL_STRING_ESCAPE_TRIGGER=160 -'->'=112 -'*'=113 -'`'=114 -'\\'=115 -':'=116 -','=117 -'||'=118 -'-'=119 -'$'=120 -'.'=121 -'=='=122 -'='=123 -'>='=124 -'>'=125 -'#'=126 -'~*'=127 -'=~*'=128 -'{'=129 -'['=130 -'('=131 -'<='=132 -'<'=133 -'!~*'=135 -'!~'=136 -'?.'=137 -'??'=138 -'%'=139 -'+'=140 -'?'=141 -'"'=142 -'f\''=143 -'F\''=144 -'\''=145 -'~'=146 -'=~'=147 -'}'=148 -']'=149 -')'=150 -';'=151 -'/'=152 -'_'=153 +EXCEPT=27 +EXTRACT=28 +FINAL=29 +FINALLY=30 +FIRST=31 +FN=32 +FOLLOWING=33 +FOR=34 +FROM=35 +FULL=36 +FUN=37 +GROUP=38 +HAVING=39 +HOUR=40 +ID=41 +IF=42 +ILIKE=43 +IN=44 +INF=45 +INNER=46 +INTERSECT=47 +INTERVAL=48 +IS=49 +JOIN=50 +KEY=51 +LAST=52 +LEADING=53 +LEFT=54 +LET=55 +LIKE=56 +LIMIT=57 +MINUTE=58 +MONTH=59 +NAN_SQL=60 +NOT=61 +NULL_SQL=62 +NULLS=63 +OFFSET=64 +ON=65 +OR=66 +ORDER=67 +OUTER=68 +OVER=69 +PARTITION=70 +PRECEDING=71 +PREWHERE=72 +QUARTER=73 +RANGE=74 +RETURN=75 +RIGHT=76 +ROLLUP=77 +ROW=78 +ROWS=79 +SAMPLE=80 +SECOND=81 +SELECT=82 +SEMI=83 +SETTINGS=84 +SUBSTRING=85 +THEN=86 +THROW=87 +TIES=88 +TIMESTAMP=89 +TO=90 +TOP=91 +TOTALS=92 +TRAILING=93 +TRIM=94 +TRUNCATE=95 +TRY=96 +UNBOUNDED=97 +UNION=98 +USING=99 +WEEK=100 +WHEN=101 +WHERE=102 +WHILE=103 +WINDOW=104 +WITH=105 +YEAR=106 +ESCAPE_CHAR_COMMON=107 +IDENTIFIER=108 +FLOATING_LITERAL=109 +OCTAL_LITERAL=110 +DECIMAL_LITERAL=111 +HEXADECIMAL_LITERAL=112 +STRING_LITERAL=113 +ARROW=114 +ASTERISK=115 +BACKQUOTE=116 +BACKSLASH=117 +COLON=118 +COMMA=119 +CONCAT=120 +DASH=121 +DOLLAR=122 +DOT=123 +EQ_DOUBLE=124 +EQ_SINGLE=125 +GT_EQ=126 +GT=127 +HASH=128 +IREGEX_SINGLE=129 +IREGEX_DOUBLE=130 +LBRACE=131 +LBRACKET=132 +LPAREN=133 +LT_EQ=134 +LT=135 +NOT_EQ=136 +NOT_IREGEX=137 +NOT_REGEX=138 +NULL_PROPERTY=139 +NULLISH=140 +PERCENT=141 +PLUS=142 +QUERY=143 +QUOTE_DOUBLE=144 +QUOTE_SINGLE_TEMPLATE=145 +QUOTE_SINGLE_TEMPLATE_FULL=146 +QUOTE_SINGLE=147 +REGEX_SINGLE=148 +REGEX_DOUBLE=149 +RBRACE=150 +RBRACKET=151 +RPAREN=152 +SEMICOLON=153 +SLASH=154 +UNDERSCORE=155 +MULTI_LINE_COMMENT=156 +SINGLE_LINE_COMMENT=157 +WHITESPACE=158 +STRING_TEXT=159 +STRING_ESCAPE_TRIGGER=160 +FULL_STRING_TEXT=161 +FULL_STRING_ESCAPE_TRIGGER=162 +'->'=114 +'*'=115 +'`'=116 +'\\'=117 +':'=118 +','=119 +'||'=120 +'-'=121 +'$'=122 +'.'=123 +'=='=124 +'='=125 +'>='=126 +'>'=127 +'#'=128 +'~*'=129 +'=~*'=130 +'{'=131 +'['=132 +'('=133 +'<='=134 +'<'=135 +'!~*'=137 +'!~'=138 +'?.'=139 +'??'=140 +'%'=141 +'+'=142 +'?'=143 +'"'=144 +'f\''=145 +'F\''=146 +'\''=147 +'~'=148 +'=~'=149 +'}'=150 +']'=151 +')'=152 +';'=153 +'/'=154 +'_'=155 diff --git a/posthog/hogql/grammar/HogQLParserVisitor.py b/posthog/hogql/grammar/HogQLParserVisitor.py index be0ba9f0e29da..98cef12617913 100644 --- a/posthog/hogql/grammar/HogQLParserVisitor.py +++ b/posthog/hogql/grammar/HogQLParserVisitor.py @@ -119,13 +119,18 @@ def visitSelect(self, ctx:HogQLParser.SelectContext): return self.visitChildren(ctx) - # Visit a parse tree produced by HogQLParser#selectUnionStmt. - def visitSelectUnionStmt(self, ctx:HogQLParser.SelectUnionStmtContext): + # Visit a parse tree produced by HogQLParser#selectStmtWithParens. + def visitSelectStmtWithParens(self, ctx:HogQLParser.SelectStmtWithParensContext): return self.visitChildren(ctx) - # Visit a parse tree produced by HogQLParser#selectStmtWithParens. - def visitSelectStmtWithParens(self, ctx:HogQLParser.SelectStmtWithParensContext): + # Visit a parse tree produced by HogQLParser#subsequentSelectSetClause. + def visitSubsequentSelectSetClause(self, ctx:HogQLParser.SubsequentSelectSetClauseContext): + return self.visitChildren(ctx) + + + # Visit a parse tree produced by HogQLParser#selectSetStmt. + def visitSelectSetStmt(self, ctx:HogQLParser.SelectSetStmtContext): return self.visitChildren(ctx) diff --git a/posthog/hogql/metadata.py b/posthog/hogql/metadata.py index 34730b7b1a19b..fdfaa8bcde774 100644 --- a/posthog/hogql/metadata.py +++ b/posthog/hogql/metadata.py @@ -13,6 +13,7 @@ from posthog.hogql.visitor import clone_expr from posthog.hogql_queries.query_runner import get_query_runner from posthog.models import Team +from posthog.hogql.resolver_utils import extract_select_queries from posthog.schema import HogQLMetadataResponse, HogQLMetadata, HogQLNotice, HogLanguage from posthog.hogql import ast @@ -99,7 +100,7 @@ def get_hogql_metadata( def process_expr_on_table( node: ast.Expr, context: HogQLContext, - source_query: Optional[ast.SelectQuery | ast.SelectUnionQuery] = None, + source_query: Optional[ast.SelectQuery | ast.SelectSetQuery] = None, ): try: if source_query is not None: @@ -114,15 +115,9 @@ def process_expr_on_table( raise -def is_valid_view(select_query: ast.SelectQuery | ast.SelectUnionQuery) -> bool: - if isinstance(select_query, ast.SelectQuery): - for field in select_query.select: +def is_valid_view(select_query: ast.SelectQuery | ast.SelectSetQuery) -> bool: + for query in extract_select_queries(select_query): + for field in query.select: if not isinstance(field, ast.Alias): return False - elif isinstance(select_query, ast.SelectUnionQuery): - for select in select_query.select_queries: - for field in select.select: - if not isinstance(field, ast.Alias): - return False - return True diff --git a/posthog/hogql/parser.py b/posthog/hogql/parser.py index 960dbe3ebf824..29a0d4dd09130 100644 --- a/posthog/hogql/parser.py +++ b/posthog/hogql/parser.py @@ -6,6 +6,7 @@ from prometheus_client import Histogram from posthog.hogql import ast +from posthog.hogql.ast import SelectSetNode from posthog.hogql.base import AST from posthog.hogql.constants import RESERVED_KEYWORDS from posthog.hogql.errors import BaseHogQLError, NotImplementedError, SyntaxError @@ -132,7 +133,7 @@ def parse_select( timings: Optional[HogQLTimings] = None, *, backend: Literal["python", "cpp"] = "cpp", -) -> ast.SelectQuery | ast.SelectUnionQuery: +) -> ast.SelectQuery | ast.SelectSetQuery: if timings is None: timings = HogQLTimings() with timings.measure(f"parse_select_{backend}"): @@ -327,28 +328,33 @@ def visitBlock(self, ctx: HogQLParser.BlockContext): ##### HogQL rules def visitSelect(self, ctx: HogQLParser.SelectContext): - return self.visit(ctx.selectUnionStmt() or ctx.selectStmt() or ctx.hogqlxTagElement()) - - def visitSelectUnionStmt(self, ctx: HogQLParser.SelectUnionStmtContext): - select_queries: list[ast.SelectQuery | ast.SelectUnionQuery | ast.Placeholder] = [ - self.visit(select) for select in ctx.selectStmtWithParens() - ] - flattened_queries: list[ast.SelectQuery] = [] - for query in select_queries: - if isinstance(query, ast.SelectQuery): - flattened_queries.append(query) - elif isinstance(query, ast.SelectUnionQuery): - flattened_queries.extend(query.select_queries) - elif isinstance(query, ast.Placeholder): - flattened_queries.append(query) # type: ignore + return self.visit(ctx.selectSetStmt() or ctx.selectStmt() or ctx.hogqlxTagElement()) + + def visitSelectSetStmt(self, ctx: HogQLParser.SelectSetStmtContext): + select_queries: list[SelectSetNode] = [] + + initial_query = self.visit(ctx.selectStmtWithParens()) + + for subsequent in ctx.subsequentSelectSetClause(): + if subsequent.UNION() and subsequent.ALL(): + union_type = "UNION ALL" + elif subsequent.INTERSECT(): + union_type = "INTERSECT" + elif subsequent.EXCEPT(): + union_type = "EXCEPT" else: - raise Exception(f"Unexpected query node type {type(query).__name__}") - if len(flattened_queries) == 1: - return flattened_queries[0] - return ast.SelectUnionQuery(select_queries=flattened_queries) + raise SyntaxError("Set operator must be one of UNION ALL, INTERSECT, and EXCEPT") + select_query = self.visit(subsequent.selectStmtWithParens()) + select_queries.append( + SelectSetNode(select_query=select_query, set_operator=cast(ast.SetOperator, union_type)) + ) + + if len(select_queries) == 0: + return initial_query + return ast.SelectSetQuery(initial_select_query=initial_query, subsequent_select_queries=select_queries) def visitSelectStmtWithParens(self, ctx: HogQLParser.SelectStmtWithParensContext): - return self.visit(ctx.selectStmt() or ctx.selectUnionStmt() or ctx.placeholder()) + return self.visit(ctx.selectStmt() or ctx.selectSetStmt() or ctx.placeholder()) def visitSelectStmt(self, ctx: HogQLParser.SelectStmtContext): select_query = ast.SelectQuery( @@ -673,7 +679,7 @@ def visitColumnExprDict(self, ctx: HogQLParser.ColumnExprDictContext): return ast.Dict(items=self.visit(ctx.kvPairList()) if ctx.kvPairList() else []) def visitColumnExprSubquery(self, ctx: HogQLParser.ColumnExprSubqueryContext): - return self.visit(ctx.selectUnionStmt()) + return self.visit(ctx.selectSetStmt()) def visitColumnExprLiteral(self, ctx: HogQLParser.ColumnExprLiteralContext): return self.visitChildren(ctx) @@ -958,7 +964,7 @@ def visitWithExprList(self, ctx: HogQLParser.WithExprListContext): return ctes def visitWithExprSubquery(self, ctx: HogQLParser.WithExprSubqueryContext): - subquery = self.visit(ctx.selectUnionStmt()) + subquery = self.visit(ctx.selectSetStmt()) name = self.visit(ctx.identifier()) return ast.CTE(name=name, expr=subquery, cte_type="subquery") @@ -992,7 +998,7 @@ def visitTableExprIdentifier(self, ctx: HogQLParser.TableExprIdentifierContext): return ast.Field(chain=chain) def visitTableExprSubquery(self, ctx: HogQLParser.TableExprSubqueryContext): - return self.visit(ctx.selectUnionStmt()) + return self.visit(ctx.selectSetStmt()) def visitTableExprPlaceholder(self, ctx: HogQLParser.TableExprPlaceholderContext): return self.visit(ctx.placeholder()) diff --git a/posthog/hogql/printer.py b/posthog/hogql/printer.py index 535057b8feea1..66f662f225fcc 100644 --- a/posthog/hogql/printer.py +++ b/posthog/hogql/printer.py @@ -266,7 +266,7 @@ def visit(self, node: AST | None): self.stack.pop() if len(self.stack) == 0 and self.dialect == "clickhouse" and self.settings: - if not isinstance(node, ast.SelectQuery) and not isinstance(node, ast.SelectUnionQuery): + if not isinstance(node, ast.SelectQuery) and not isinstance(node, ast.SelectSetQuery): raise QueryError("Settings can only be applied to SELECT queries") settings = self._print_settings(self.settings) if settings is not None: @@ -274,17 +274,25 @@ def visit(self, node: AST | None): return response - def visit_select_union_query(self, node: ast.SelectUnionQuery): + def visit_select_set_query(self, node: ast.SelectSetQuery): self._indent -= 1 - queries = [self.visit(expr) for expr in node.select_queries] + ret = self.visit(node.initial_select_query) if self.pretty: - query = f"\n{self.indent(1)}UNION ALL\n{self.indent(1)}".join([query.strip() for query in queries]) - else: - query = " UNION ALL ".join(queries) + ret = ret.strip() + for expr in node.subsequent_select_queries: + query = self.visit(expr.select_query) + if self.pretty: + query = query.strip() + if expr.set_operator is not None: + if self.pretty: + ret += f"\n{self.indent(1)}{expr.set_operator}\n{self.indent(1)}" + else: + ret += f" {expr.set_operator} " + ret += query self._indent += 1 if len(self.stack) > 1: - return f"({query.strip()})" - return query + return f"({ret.strip()})" + return ret def visit_select_query(self, node: ast.SelectQuery): if self.dialect == "clickhouse": @@ -293,8 +301,8 @@ def visit_select_query(self, node: ast.SelectQuery): if not self.context.team_id: raise InternalHogQLError("Full SELECT queries are disabled if context.team_id is not set") - # if we are the first parsed node in the tree, or a child of a SelectUnionQuery, mark us as a top level query - part_of_select_union = len(self.stack) >= 2 and isinstance(self.stack[-2], ast.SelectUnionQuery) + # if we are the first parsed node in the tree, or a child of a SelectSetQuery, mark us as a top level query + part_of_select_union = len(self.stack) >= 2 and isinstance(self.stack[-2], ast.SelectSetQuery) is_top_level_query = len(self.stack) <= 1 or (len(self.stack) == 2 and part_of_select_union) # We will add extra clauses onto this from the joined tables @@ -507,7 +515,7 @@ def visit_join_expr(self, node: ast.JoinExpr) -> JoinExprResponse: elif isinstance(node.type, ast.SelectQueryType): join_strings.append(self.visit(node.table)) - elif isinstance(node.type, ast.SelectUnionQueryType): + elif isinstance(node.type, ast.SelectSetQueryType): join_strings.append(self.visit(node.table)) elif isinstance(node.type, ast.SelectViewType) and node.alias is not None: @@ -1251,7 +1259,7 @@ def visit_field_type(self, type: ast.FieldType): isinstance(type.table_type, ast.SelectQueryType) or isinstance(type.table_type, ast.SelectQueryAliasType) or isinstance(type.table_type, ast.SelectViewType) - or isinstance(type.table_type, ast.SelectUnionQueryType) + or isinstance(type.table_type, ast.SelectSetQueryType) ): field_sql = self._print_identifier(type.name) if isinstance(type.table_type, ast.SelectQueryAliasType) or isinstance(type.table_type, ast.SelectViewType): diff --git a/posthog/hogql/query.py b/posthog/hogql/query.py index 2516d8007d815..1a556e1298b28 100644 --- a/posthog/hogql/query.py +++ b/posthog/hogql/query.py @@ -19,6 +19,7 @@ from posthog.hogql.timings import HogQLTimings from posthog.hogql.variables import replace_variables from posthog.hogql.visitor import clone_expr +from posthog.hogql.resolver_utils import extract_select_queries from posthog.models.team import Team from posthog.clickhouse.query_tagging import tag_queries from posthog.client import sync_execute @@ -35,7 +36,7 @@ def execute_hogql_query( - query: Union[str, ast.SelectQuery, ast.SelectUnionQuery], + query: Union[str, ast.SelectQuery, ast.SelectSetQuery], team: Team, *, query_type: str = "hogql_query", @@ -65,7 +66,7 @@ def execute_hogql_query( metadata: Optional[HogQLMetadataResponse] = None with timings.measure("query"): - if isinstance(query, ast.SelectQuery) or isinstance(query, ast.SelectUnionQuery): + if isinstance(query, ast.SelectQuery) or isinstance(query, ast.SelectSetQuery): select_query = query query = None else: @@ -105,10 +106,7 @@ def execute_hogql_query( select_query = replace_placeholders(select_query, placeholders) with timings.measure("max_limit"): - select_queries = ( - select_query.select_queries if isinstance(select_query, ast.SelectUnionQuery) else [select_query] - ) - for one_query in select_queries: + for one_query in extract_select_queries(select_query): if one_query.limit is None: one_query.limit = ast.Constant(value=get_default_limit_for_context(limit_context)) @@ -138,8 +136,8 @@ def execute_hogql_query( ) print_columns = [] columns_query = ( - select_query_hogql.select_queries[0] - if isinstance(select_query_hogql, ast.SelectUnionQuery) + next(extract_select_queries(select_query_hogql)) + if isinstance(select_query_hogql, ast.SelectSetQuery) else select_query_hogql ) for node in columns_query.select: diff --git a/posthog/hogql/resolver.py b/posthog/hogql/resolver.py index b263843598f87..e1ddae4c545f0 100644 --- a/posthog/hogql/resolver.py +++ b/posthog/hogql/resolver.py @@ -24,7 +24,12 @@ from posthog.hogql.functions.sparkline import sparkline from posthog.hogql.hogqlx import HOGQLX_COMPONENTS, convert_to_hx from posthog.hogql.parser import parse_select -from posthog.hogql.resolver_utils import expand_hogqlx_query, lookup_cte_by_name, lookup_field_by_name +from posthog.hogql.resolver_utils import ( + expand_hogqlx_query, + lookup_cte_by_name, + lookup_field_by_name, + extract_select_queries, +) from posthog.hogql.visitor import CloningVisitor, TraversingVisitor, clone_expr from posthog.models.utils import UUIDT @@ -123,15 +128,17 @@ def visit(self, node: ast.AST | None): raise QueryError("Too many CTE expansions (50+). Probably a CTE loop.") return super().visit(node) - def visit_select_union_query(self, node: ast.SelectUnionQuery): + def visit_select_set_query(self, node: ast.SelectSetQuery): # all expressions combined by UNION ALL can use CTEs from the first expression # so we put these CTEs to the scope - default_ctes = node.select_queries[0].ctes if node.select_queries else None + default_ctes = next(extract_select_queries(node)).ctes if default_ctes: self.scopes.append(ast.SelectQueryType(ctes=default_ctes)) - node = super().visit_select_union_query(node) - node.type = ast.SelectUnionQueryType(types=[expr.type for expr in node.select_queries]) + node = super().visit_select_set_query(node) + node.type = ast.SelectSetQueryType( + types=[node.initial_select_query.type, *(x.select_query.type for x in node.subsequent_select_queries)] # type: ignore + ) if default_ctes: self.scopes.pop() @@ -254,7 +261,7 @@ def _asterisk_columns(self, asterisk: ast.AsteriskType) -> list[ast.Expr]: database_fields = table.get_asterisk() return [ast.Field(chain=[key]) for key in database_fields.keys()] elif ( - isinstance(asterisk.table_type, ast.SelectUnionQueryType) + isinstance(asterisk.table_type, ast.SelectSetQueryType) or isinstance(asterisk.table_type, ast.SelectQueryType) or isinstance(asterisk.table_type, ast.SelectQueryAliasType) or isinstance(asterisk.table_type, ast.SelectViewType) @@ -262,7 +269,7 @@ def _asterisk_columns(self, asterisk: ast.AsteriskType) -> list[ast.Expr]: select = asterisk.table_type while isinstance(select, ast.SelectQueryAliasType) or isinstance(select, ast.SelectViewType): select = select.select_query_type - if isinstance(select, ast.SelectUnionQueryType): + if isinstance(select, ast.SelectSetQueryType): select = select.types[0] if isinstance(select, ast.SelectQueryType): return [ast.Field(chain=[key]) for key in select.columns.keys()] @@ -369,7 +376,7 @@ def visit_join_expr(self, node: ast.JoinExpr): return node - elif isinstance(node.table, ast.SelectQuery) or isinstance(node.table, ast.SelectUnionQuery): + elif isinstance(node.table, ast.SelectQuery) or isinstance(node.table, ast.SelectSetQuery): node = cast(ast.JoinExpr, clone_expr(node)) if node.constraint and node.constraint.constraint_type == "USING": # visit USING constraint before adding the table to avoid ambiguous names diff --git a/posthog/hogql/resolver_utils.py b/posthog/hogql/resolver_utils.py index f67f683449b02..6ed44a9643d2a 100644 --- a/posthog/hogql/resolver_utils.py +++ b/posthog/hogql/resolver_utils.py @@ -1,4 +1,5 @@ from typing import Optional +from collections.abc import Generator from posthog import schema from posthog.hogql import ast @@ -86,3 +87,12 @@ def expand_hogqlx_query(node: ast.HogQLXTag, team_id: Optional[int]): return query except Exception as e: raise ResolutionError(f"Error parsing query tag: {e}", start=node.start, end=node.end) + + +def extract_select_queries(select: ast.SelectSetQuery | ast.SelectQuery) -> Generator[ast.SelectQuery, None, None]: + if isinstance(select, ast.SelectQuery): + yield select + else: + yield from extract_select_queries(select.initial_select_query) + for select_query in select.subsequent_select_queries: + yield from extract_select_queries(select_query.select_query) diff --git a/posthog/hogql/test/__snapshots__/test_resolver.ambr b/posthog/hogql/test/__snapshots__/test_resolver.ambr index d38d909cc43e7..0131376631bcc 100644 --- a/posthog/hogql/test/__snapshots__/test_resolver.ambr +++ b/posthog/hogql/test/__snapshots__/test_resolver.ambr @@ -2065,925 +2065,928 @@ ] select_from: { table: { - select_queries: [ - { - select: [ - { - alias: "uuid" - expr: { - chain: [ - "uuid" - ] - type: - } - hidden: True + initial_select_query: { + select: [ + { + alias: "uuid" + expr: { + chain: [ + "uuid" + ] type: - }, - { - alias: "event" - expr: { - chain: [ - "event" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "event" + expr: { + chain: [ + "event" + ] type: - }, - { - alias: "properties" - expr: { - chain: [ - "properties" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "properties" + expr: { + chain: [ + "properties" + ] type: - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "timestamp" + expr: { + chain: [ + "timestamp" + ] type: - }, - { - alias: "distinct_id" - expr: { - chain: [ - "distinct_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "distinct_id" + expr: { + chain: [ + "distinct_id" + ] type: - }, - { - alias: "elements_chain" - expr: { - chain: [ - "elements_chain" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain" + expr: { + chain: [ + "elements_chain" + ] type: - }, - { - alias: "created_at" - expr: { - chain: [ - "created_at" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "created_at" + expr: { + chain: [ + "created_at" + ] type: - }, - { - alias: "$session_id" - expr: { - chain: [ - "$session_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$session_id" + expr: { + chain: [ + "$session_id" + ] type: - }, - { - alias: "$window_id" - expr: { - chain: [ - "$window_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$window_id" + expr: { + chain: [ + "$window_id" + ] type: - }, - { - alias: "person_id" - expr: { - args: [ - { - args: [ - { - args: [ - { - alias: "distinct_id" - expr: { - chain: [ - "override", - "distinct_id" - ] - type: { - name: "distinct_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None - } - table_type: + } + hidden: True + type: + }, + { + alias: "person_id" + expr: { + args: [ + { + args: [ + { + args: [ + { + alias: "distinct_id" + expr: { + chain: [ + "override", + "distinct_id" + ] + type: { + name: "distinct_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None } + table_type: } } - hidden: True - type: { - alias: "distinct_id" - type: - } } - ] - distinct: False - name: "empty" - type: { - arg_types: [ - { - data_type: "str" - nullable: False - } - ] - name: "empty" - return_type: { - data_type: "unknown" - nullable: True + hidden: True + type: { + alias: "distinct_id" + type: } } - } - ] - distinct: False - name: "not" - type: { - arg_types: [ - - ] - name: "not" - return_type: - } - }, - { - alias: "person_id" - expr: { - chain: [ - "override", - "person_id" ] + distinct: False + name: "empty" type: { - name: "person_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None + arg_types: [ + { + data_type: "str" + nullable: False } - table_type: + ] + name: "empty" + return_type: { + data_type: "unknown" + nullable: True } } } - hidden: True + ] + distinct: False + name: "not" + type: { + arg_types: [ + + ] + name: "not" + return_type: + } + }, + { + alias: "person_id" + expr: { + chain: [ + "override", + "person_id" + ] type: { - alias: "person_id" - type: - } - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] - type: { - name: "event_person_id" + name: "person_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None + } table_type: } } - hidden: True + } + hidden: True + type: { + alias: "person_id" + type: + } + }, + { + alias: "event_person_id" + expr: { + chain: [ + "event_person_id" + ] type: { - alias: "event_person_id" - type: + name: "event_person_id" + table_type: } } - ] - distinct: False - name: "if" - type: - } - hidden: True - type: - }, - { - alias: "$group_0" - expr: { - chain: [ - "$group_0" - ] - type: - } - hidden: True + hidden: True + type: { + alias: "event_person_id" + type: + } + } + ] + distinct: False + name: "if" type: - }, - { - alias: "$group_1" - expr: { - chain: [ - "$group_1" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_0" + expr: { + chain: [ + "$group_0" + ] type: - }, - { - alias: "$group_2" - expr: { - chain: [ - "$group_2" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_1" + expr: { + chain: [ + "$group_1" + ] type: - }, - { - alias: "$group_3" - expr: { - chain: [ - "$group_3" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_2" + expr: { + chain: [ + "$group_2" + ] type: - }, - { - alias: "$group_4" - expr: { - chain: [ - "$group_4" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_3" + expr: { + chain: [ + "$group_3" + ] type: - }, - { - alias: "elements_chain_href" - expr: { - chain: [ - "elements_chain_href" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "$group_4" + expr: { + chain: [ + "$group_4" + ] type: - }, - { - alias: "elements_chain_texts" - expr: { - chain: [ - "elements_chain_texts" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_href" + expr: { + chain: [ + "elements_chain_href" + ] type: - }, - { - alias: "elements_chain_ids" - expr: { - chain: [ - "elements_chain_ids" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_texts" + expr: { + chain: [ + "elements_chain_texts" + ] type: - }, - { - alias: "elements_chain_elements" - expr: { - chain: [ - "elements_chain_elements" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_ids" + expr: { + chain: [ + "elements_chain_ids" + ] type: - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] - type: - } - hidden: True + } + hidden: True + type: + }, + { + alias: "elements_chain_elements" + expr: { + chain: [ + "elements_chain_elements" + ] type: } - ] - select_from: { - table: { + hidden: True + type: + }, + { + alias: "event_person_id" + expr: { chain: [ - "events" + "event_person_id" ] type: } + hidden: True + type: + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } type: - }, + } + type: + } + subsequent_select_queries: [ { - select: [ - { - alias: "uuid" - expr: { - chain: [ - "uuid" - ] - type: { - name: "uuid" - table_type: { - table: { - fields: { - $group_0: {}, - $group_1: {}, - $group_2: {}, - $group_3: {}, - $group_4: {}, - $session_id: {}, - $window_id: {}, - created_at: {}, - distinct_id: {}, - elements_chain: {}, - elements_chain_elements: {}, - elements_chain_href: {}, - elements_chain_ids: {}, - elements_chain_texts: {}, - event: {}, - event_person_id: {}, - goe_0: {}, - goe_1: {}, - goe_2: {}, - goe_3: {}, - goe_4: {}, - group_0: {}, - group_1: {}, - group_2: {}, - group_3: {}, - group_4: {}, - override: {}, - pdi: {}, - person: {}, - person_id: {}, - poe: {}, - properties: {}, - session: {}, - team_id: {}, - timestamp: {}, - uuid: {} + select_query: { + select: [ + { + alias: "uuid" + expr: { + chain: [ + "uuid" + ] + type: { + name: "uuid" + table_type: { + table: { + fields: { + $group_0: {}, + $group_1: {}, + $group_2: {}, + $group_3: {}, + $group_4: {}, + $session_id: {}, + $window_id: {}, + created_at: {}, + distinct_id: {}, + elements_chain: {}, + elements_chain_elements: {}, + elements_chain_href: {}, + elements_chain_ids: {}, + elements_chain_texts: {}, + event: {}, + event_person_id: {}, + goe_0: {}, + goe_1: {}, + goe_2: {}, + goe_3: {}, + goe_4: {}, + group_0: {}, + group_1: {}, + group_2: {}, + group_3: {}, + group_4: {}, + override: {}, + pdi: {}, + person: {}, + person_id: {}, + poe: {}, + properties: {}, + session: {}, + team_id: {}, + timestamp: {}, + uuid: {} + } } } } } - } - hidden: True - type: { - alias: "uuid" - type: - } - }, - { - alias: "event" - expr: { - chain: [ - "event" - ] + hidden: True type: { - name: "event" - table_type: + alias: "uuid" + type: } - } - hidden: True - type: { + }, + { alias: "event" - type: - } - }, - { - alias: "properties" - expr: { - chain: [ - "properties" - ] + expr: { + chain: [ + "event" + ] + type: { + name: "event" + table_type: + } + } + hidden: True type: { - name: "properties" - table_type: + alias: "event" + type: } - } - hidden: True - type: { + }, + { alias: "properties" - type: - } - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] + expr: { + chain: [ + "properties" + ] + type: { + name: "properties" + table_type: + } + } + hidden: True type: { - name: "timestamp" - table_type: + alias: "properties" + type: } - } - hidden: True - type: { + }, + { alias: "timestamp" - type: - } - }, - { - alias: "distinct_id" - expr: { - chain: [ - "distinct_id" - ] + expr: { + chain: [ + "timestamp" + ] + type: { + name: "timestamp" + table_type: + } + } + hidden: True type: { - name: "distinct_id" - table_type: + alias: "timestamp" + type: } - } - hidden: True - type: { + }, + { alias: "distinct_id" - type: - } - }, - { - alias: "elements_chain" - expr: { - chain: [ - "elements_chain" - ] + expr: { + chain: [ + "distinct_id" + ] + type: { + name: "distinct_id" + table_type: + } + } + hidden: True type: { - name: "elements_chain" - table_type: + alias: "distinct_id" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain" - type: - } - }, - { - alias: "created_at" - expr: { - chain: [ - "created_at" - ] + expr: { + chain: [ + "elements_chain" + ] + type: { + name: "elements_chain" + table_type: + } + } + hidden: True type: { - name: "created_at" - table_type: + alias: "elements_chain" + type: } - } - hidden: True - type: { + }, + { alias: "created_at" - type: - } - }, - { - alias: "$session_id" - expr: { - chain: [ - "$session_id" - ] + expr: { + chain: [ + "created_at" + ] + type: { + name: "created_at" + table_type: + } + } + hidden: True type: { - name: "$session_id" - table_type: + alias: "created_at" + type: } - } - hidden: True - type: { + }, + { alias: "$session_id" - type: - } - }, - { - alias: "$window_id" - expr: { - chain: [ - "$window_id" - ] + expr: { + chain: [ + "$session_id" + ] + type: { + name: "$session_id" + table_type: + } + } + hidden: True type: { - name: "$window_id" - table_type: + alias: "$session_id" + type: } - } - hidden: True - type: { + }, + { alias: "$window_id" - type: - } - }, - { - alias: "person_id" - expr: { - args: [ - { - args: [ - { - args: [ - { - alias: "distinct_id" - expr: { - chain: [ - "override", - "distinct_id" - ] - type: { - name: "distinct_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None + expr: { + chain: [ + "$window_id" + ] + type: { + name: "$window_id" + table_type: + } + } + hidden: True + type: { + alias: "$window_id" + type: + } + }, + { + alias: "person_id" + expr: { + args: [ + { + args: [ + { + args: [ + { + alias: "distinct_id" + expr: { + chain: [ + "override", + "distinct_id" + ] + type: { + name: "distinct_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None + } + table_type: } - table_type: } } - } - hidden: True - type: { - alias: "distinct_id" - type: - } - } - ] - distinct: False - name: "empty" - type: { - arg_types: [ - { - data_type: "str" - nullable: False + hidden: True + type: { + alias: "distinct_id" + type: + } } ] + distinct: False name: "empty" - return_type: { - data_type: "unknown" - nullable: True + type: { + arg_types: [ + { + data_type: "str" + nullable: False + } + ] + name: "empty" + return_type: { + data_type: "unknown" + nullable: True + } } } - } - ] - distinct: False - name: "not" - type: { - arg_types: [ - ] + distinct: False name: "not" - return_type: { - data_type: "unknown" - nullable: True - } - } - }, - { - alias: "person_id" - expr: { - chain: [ - "override", - "person_id" - ] type: { - name: "person_id" - table_type: { - field: "override" - lazy_join: { - from_field: [ - "distinct_id" - ], - join_function: , - join_table: { - fields: { - distinct_id: {}, - person: {}, - person_id: {}, - team_id: {} - } - }, - to_field: None - } - table_type: + arg_types: [ + + ] + name: "not" + return_type: { + data_type: "unknown" + nullable: True } } - } - hidden: True - type: { + }, + { alias: "person_id" - type: - } - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] + expr: { + chain: [ + "override", + "person_id" + ] + type: { + name: "person_id" + table_type: { + field: "override" + lazy_join: { + from_field: [ + "distinct_id" + ], + join_function: , + join_table: { + fields: { + distinct_id: {}, + person: {}, + person_id: {}, + team_id: {} + } + }, + to_field: None + } + table_type: + } + } + } + hidden: True type: { - name: "event_person_id" - table_type: + alias: "person_id" + type: } - } - hidden: True - type: { - alias: "event_person_id" - type: - } - } - ] - distinct: False - name: "if" - type: { - arg_types: [ - , - { - data_type: "str" - nullable: False }, { - data_type: "str" - nullable: False + alias: "event_person_id" + expr: { + chain: [ + "event_person_id" + ] + type: { + name: "event_person_id" + table_type: + } + } + hidden: True + type: { + alias: "event_person_id" + type: + } } ] + distinct: False name: "if" - return_type: { - data_type: "unknown" - nullable: True + type: { + arg_types: [ + , + { + data_type: "str" + nullable: False + }, + { + data_type: "str" + nullable: False + } + ] + name: "if" + return_type: { + data_type: "unknown" + nullable: True + } } } - } - hidden: True - type: { - alias: "person_id" - type: - } - }, - { - alias: "$group_0" - expr: { - chain: [ - "$group_0" - ] + hidden: True type: { - name: "$group_0" - table_type: + alias: "person_id" + type: } - } - hidden: True - type: { + }, + { alias: "$group_0" - type: - } - }, - { - alias: "$group_1" - expr: { - chain: [ - "$group_1" - ] + expr: { + chain: [ + "$group_0" + ] + type: { + name: "$group_0" + table_type: + } + } + hidden: True type: { - name: "$group_1" - table_type: + alias: "$group_0" + type: } - } - hidden: True - type: { + }, + { alias: "$group_1" - type: - } - }, - { - alias: "$group_2" - expr: { - chain: [ - "$group_2" - ] + expr: { + chain: [ + "$group_1" + ] + type: { + name: "$group_1" + table_type: + } + } + hidden: True type: { - name: "$group_2" - table_type: + alias: "$group_1" + type: } - } - hidden: True - type: { + }, + { alias: "$group_2" - type: - } - }, - { - alias: "$group_3" - expr: { - chain: [ - "$group_3" - ] + expr: { + chain: [ + "$group_2" + ] + type: { + name: "$group_2" + table_type: + } + } + hidden: True type: { - name: "$group_3" - table_type: + alias: "$group_2" + type: } - } - hidden: True - type: { + }, + { alias: "$group_3" - type: - } - }, - { - alias: "$group_4" - expr: { - chain: [ - "$group_4" - ] + expr: { + chain: [ + "$group_3" + ] + type: { + name: "$group_3" + table_type: + } + } + hidden: True type: { - name: "$group_4" - table_type: + alias: "$group_3" + type: } - } - hidden: True - type: { + }, + { alias: "$group_4" - type: - } - }, - { - alias: "elements_chain_href" - expr: { - chain: [ - "elements_chain_href" - ] + expr: { + chain: [ + "$group_4" + ] + type: { + name: "$group_4" + table_type: + } + } + hidden: True type: { - name: "elements_chain_href" - table_type: + alias: "$group_4" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_href" - type: - } - }, - { - alias: "elements_chain_texts" - expr: { - chain: [ - "elements_chain_texts" - ] + expr: { + chain: [ + "elements_chain_href" + ] + type: { + name: "elements_chain_href" + table_type: + } + } + hidden: True type: { - name: "elements_chain_texts" - table_type: + alias: "elements_chain_href" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_texts" - type: - } - }, - { - alias: "elements_chain_ids" - expr: { - chain: [ - "elements_chain_ids" - ] + expr: { + chain: [ + "elements_chain_texts" + ] + type: { + name: "elements_chain_texts" + table_type: + } + } + hidden: True type: { - name: "elements_chain_ids" - table_type: + alias: "elements_chain_texts" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_ids" - type: - } - }, - { - alias: "elements_chain_elements" - expr: { - chain: [ - "elements_chain_elements" - ] + expr: { + chain: [ + "elements_chain_ids" + ] + type: { + name: "elements_chain_ids" + table_type: + } + } + hidden: True type: { - name: "elements_chain_elements" - table_type: + alias: "elements_chain_ids" + type: } - } - hidden: True - type: { + }, + { alias: "elements_chain_elements" - type: - } - }, - { - alias: "event_person_id" - expr: { - chain: [ - "event_person_id" - ] + expr: { + chain: [ + "elements_chain_elements" + ] + type: { + name: "elements_chain_elements" + table_type: + } + } + hidden: True type: { - name: "event_person_id" - table_type: + alias: "elements_chain_elements" + type: } - } - hidden: True - type: { + }, + { alias: "event_person_id" + expr: { + chain: [ + "event_person_id" + ] + type: { + name: "event_person_id" + table_type: + } + } + hidden: True + type: { + alias: "event_person_id" + type: + } + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } - } - ] - select_from: { - table: { - chain: [ - "events" - ] type: } - type: - } - type: { - aliases: {} - anonymous_tables: [] - columns: { - $group_0: , - $group_1: , - $group_2: , - $group_3: , - $group_4: , - $session_id: , - $window_id: , - created_at: , - distinct_id: , - elements_chain: , - elements_chain_elements: , - elements_chain_href: , - elements_chain_ids: , - elements_chain_texts: , - event: , - event_person_id: , - person_id: , - properties: , - timestamp: , - uuid: - } - ctes: {} - tables: { - events: + type: { + aliases: {} + anonymous_tables: [] + columns: { + $group_0: , + $group_1: , + $group_2: , + $group_3: , + $group_4: , + $session_id: , + $window_id: , + created_at: , + distinct_id: , + elements_chain: , + elements_chain_elements: , + elements_chain_href: , + elements_chain_ids: , + elements_chain_texts: , + event: , + event_person_id: , + person_id: , + properties: , + timestamp: , + uuid: + } + ctes: {} + tables: { + events: + } } } + set_operator: "UNION ALL" } ] type: { @@ -6128,206 +6131,209 @@ # name: TestResolver.test_resolve_union_all ''' { - select_queries: [ - { - select: [ - { - alias: "event" - expr: { - chain: [ - "event" - ] - type: { - name: "event" - table_type: { - table: { - fields: { - $group_0: {}, - $group_1: {}, - $group_2: {}, - $group_3: {}, - $group_4: {}, - $session_id: {}, - $window_id: {}, - created_at: {}, - distinct_id: {}, - elements_chain: {}, - elements_chain_elements: {}, - elements_chain_href: {}, - elements_chain_ids: {}, - elements_chain_texts: {}, - event: {}, - event_person_id: {}, - goe_0: {}, - goe_1: {}, - goe_2: {}, - goe_3: {}, - goe_4: {}, - group_0: {}, - group_1: {}, - group_2: {}, - group_3: {}, - group_4: {}, - override: {}, - pdi: {}, - person: {}, - person_id: {}, - poe: {}, - properties: {}, - session: {}, - team_id: {}, - timestamp: {}, - uuid: {} - } + initial_select_query: { + select: [ + { + alias: "event" + expr: { + chain: [ + "event" + ] + type: { + name: "event" + table_type: { + table: { + fields: { + $group_0: {}, + $group_1: {}, + $group_2: {}, + $group_3: {}, + $group_4: {}, + $session_id: {}, + $window_id: {}, + created_at: {}, + distinct_id: {}, + elements_chain: {}, + elements_chain_elements: {}, + elements_chain_href: {}, + elements_chain_ids: {}, + elements_chain_texts: {}, + event: {}, + event_person_id: {}, + goe_0: {}, + goe_1: {}, + goe_2: {}, + goe_3: {}, + goe_4: {}, + group_0: {}, + group_1: {}, + group_2: {}, + group_3: {}, + group_4: {}, + override: {}, + pdi: {}, + person: {}, + person_id: {}, + poe: {}, + properties: {}, + session: {}, + team_id: {}, + timestamp: {}, + uuid: {} } } } } - hidden: True - type: { - alias: "event" - type: - } - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] - type: { - name: "timestamp" - table_type: - } - } - hidden: True - type: { - alias: "timestamp" - type: - } } - ] - select_from: { - table: { + hidden: True + type: { + alias: "event" + type: + } + }, + { + alias: "timestamp" + expr: { chain: [ - "events" + "timestamp" ] + type: { + name: "timestamp" + table_type: + } + } + hidden: True + type: { + alias: "timestamp" type: } + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } - type: { - aliases: {} - anonymous_tables: [] - columns: { - event: , - timestamp: - } - ctes: {} - tables: { - events: - } + type: + } + type: { + aliases: {} + anonymous_tables: [] + columns: { + event: , + timestamp: } - }, + ctes: {} + tables: { + events: + } + } + } + subsequent_select_queries: [ { - select: [ - { - alias: "event" - expr: { - chain: [ - "event" - ] - type: { - name: "event" - table_type: { - table: { - fields: { - $group_0: {}, - $group_1: {}, - $group_2: {}, - $group_3: {}, - $group_4: {}, - $session_id: {}, - $window_id: {}, - created_at: {}, - distinct_id: {}, - elements_chain: {}, - elements_chain_elements: {}, - elements_chain_href: {}, - elements_chain_ids: {}, - elements_chain_texts: {}, - event: {}, - event_person_id: {}, - goe_0: {}, - goe_1: {}, - goe_2: {}, - goe_3: {}, - goe_4: {}, - group_0: {}, - group_1: {}, - group_2: {}, - group_3: {}, - group_4: {}, - override: {}, - pdi: {}, - person: {}, - person_id: {}, - poe: {}, - properties: {}, - session: {}, - team_id: {}, - timestamp: {}, - uuid: {} + select_query: { + select: [ + { + alias: "event" + expr: { + chain: [ + "event" + ] + type: { + name: "event" + table_type: { + table: { + fields: { + $group_0: {}, + $group_1: {}, + $group_2: {}, + $group_3: {}, + $group_4: {}, + $session_id: {}, + $window_id: {}, + created_at: {}, + distinct_id: {}, + elements_chain: {}, + elements_chain_elements: {}, + elements_chain_href: {}, + elements_chain_ids: {}, + elements_chain_texts: {}, + event: {}, + event_person_id: {}, + goe_0: {}, + goe_1: {}, + goe_2: {}, + goe_3: {}, + goe_4: {}, + group_0: {}, + group_1: {}, + group_2: {}, + group_3: {}, + group_4: {}, + override: {}, + pdi: {}, + person: {}, + person_id: {}, + poe: {}, + properties: {}, + session: {}, + team_id: {}, + timestamp: {}, + uuid: {} + } } } } } - } - hidden: True - type: { - alias: "event" - type: - } - }, - { - alias: "timestamp" - expr: { - chain: [ - "timestamp" - ] + hidden: True type: { - name: "timestamp" - table_type: + alias: "event" + type: } - } - hidden: True - type: { + }, + { alias: "timestamp" + expr: { + chain: [ + "timestamp" + ] + type: { + name: "timestamp" + table_type: + } + } + hidden: True + type: { + alias: "timestamp" + type: + } + } + ] + select_from: { + table: { + chain: [ + "events" + ] type: } - } - ] - select_from: { - table: { - chain: [ - "events" - ] type: } - type: - } - type: { - aliases: {} - anonymous_tables: [] - columns: { - event: , - timestamp: - } - ctes: {} - tables: { - events: + type: { + aliases: {} + anonymous_tables: [] + columns: { + event: , + timestamp: + } + ctes: {} + tables: { + events: + } } } + set_operator: "UNION ALL" } ] type: { diff --git a/posthog/hogql/test/_test_parser.py b/posthog/hogql/test/_test_parser.py index 03f8dee976152..b86fca986a963 100644 --- a/posthog/hogql/test/_test_parser.py +++ b/posthog/hogql/test/_test_parser.py @@ -21,6 +21,8 @@ Array, Dict, VariableDeclaration, + SelectSetNode, + SelectSetQuery, ) from posthog.hogql.parser import parse_program @@ -50,9 +52,9 @@ def _expr(self, expr: str, placeholders: Optional[dict[str, ast.Expr]] = None) - def _select( self, query: str, placeholders: Optional[dict[str, ast.Expr]] = None - ) -> ast.SelectQuery | ast.SelectUnionQuery | ast.HogQLXTag: + ) -> ast.SelectQuery | ast.SelectSetQuery | ast.HogQLXTag: return cast( - ast.SelectQuery | ast.SelectUnionQuery | ast.HogQLXTag, + ast.SelectQuery | ast.SelectSetQuery | ast.HogQLXTag, clear_locations(parse_select(query, placeholders=placeholders, backend=backend)), ) @@ -1381,12 +1383,48 @@ def test_placeholder_expressions(self): def test_select_union_all(self): self.assertEqual( self._select("select 1 union all select 2 union all select 3"), - ast.SelectUnionQuery( - select_queries=[ - ast.SelectQuery(select=[ast.Constant(value=1)]), - ast.SelectQuery(select=[ast.Constant(value=2)]), - ast.SelectQuery(select=[ast.Constant(value=3)]), - ] + ast.SelectSetQuery( + initial_select_query=ast.SelectQuery(select=[ast.Constant(value=1)]), + subsequent_select_queries=[ + SelectSetNode(set_operator="UNION ALL", select_query=query) + for query in ( + ast.SelectQuery(select=[ast.Constant(value=2)]), + ast.SelectQuery(select=[ast.Constant(value=3)]), + ) + ], + ), + ) + + def test_nested_selects(self): + self.assertEqual( + self._select("(select 1 intersect select 2) union all (select 3 except select 4)"), + SelectSetQuery( + initial_select_query=SelectSetQuery( + initial_select_query=SelectQuery(select=[Constant(value=1)]), + subsequent_select_queries=[ + SelectSetNode( + select_query=SelectQuery( + select=[Constant(value=2)], + ), + set_operator="INTERSECT", + ) + ], + ), + subsequent_select_queries=[ + SelectSetNode( + select_query=SelectSetQuery( + initial_select_query=SelectQuery( + select=[Constant(value=3)], + ), + subsequent_select_queries=[ + SelectSetNode( + select_query=SelectQuery(select=[Constant(value=4)]), set_operator="EXCEPT" + ) + ], + ), + set_operator="UNION ALL", + ) + ], ), ) diff --git a/posthog/hogql/test/test_printer.py b/posthog/hogql/test/test_printer.py index 0a829c470d877..a26ac3ac0352b 100644 --- a/posthog/hogql/test/test_printer.py +++ b/posthog/hogql/test/test_printer.py @@ -114,6 +114,136 @@ def test_to_printed_hogql(self): repsponse, f"SELECT\n plus(1, 2),\n 3\nFROM\n events\nLIMIT {MAX_SELECT_RETURNED_ROWS}" ) + def test_intersect(self): + expr = parse_select("""select 1 as id intersect select 2 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + f"SELECT\n 1 AS id\nLIMIT 50000\nINTERSECT\nSELECT\n 2 AS id\nLIMIT {MAX_SELECT_RETURNED_ROWS}", + ) + + def test_except(self): + expr = parse_select("""select 1 as id except select 2 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + f"SELECT\n 1 AS id\nLIMIT 50000\nEXCEPT\nSELECT\n 2 AS id\nLIMIT {MAX_SELECT_RETURNED_ROWS}", + ) + + # these share the same priority, should stay in order + def test_except_and_union(self): + expr = parse_select("""select 1 as id except select 2 as id union all select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + ( + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "EXCEPT\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000" + ), + ) + + def test_union_and_except(self): + expr = parse_select("""select 1 as id union all select 2 as id except select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + ( + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "EXCEPT\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000" + ), + ) + + def test_intersect3(self): + expr = parse_select("""select 1 as id intersect select 2 as id intersect select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000", + ) + + def test_union3(self): + expr = parse_select("""select 1 as id union all select 2 as id union all select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000", + ) + + def test_intersect_and_union_parens(self): + expr = parse_select("""select 1 as id intersect (select 2 as id union all select 3 as id)""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "(SELECT\n" + " 2 AS id\n" + "UNION ALL\n" + "SELECT\n" + " 3 AS id)", + ) + + # INTERSECT has higher priority than union + def test_intersect_and_union(self): + expr = parse_select("""select 1 as id union all select 2 as id intersect select 3 as id""") + response = to_printed_hogql(expr, self.team) + self.assertEqual( + response, + ( + "SELECT\n" + " 1 AS id\n" + "LIMIT 50000\n" + "UNION ALL\n" + "SELECT\n" + " 2 AS id\n" + "LIMIT 50000\n" + "INTERSECT\n" + "SELECT\n" + " 3 AS id\n" + "LIMIT 50000" + ), + ) + def test_print_to_string(self): assert str(parse_select("select 1 + 2, 3 from events")) == "sql(SELECT plus(1, 2), 3 FROM events)" assert str(parse_expr("1 + 2")) == "sql(plus(1, 2))" @@ -1076,7 +1206,7 @@ def test_select_union_all(self): ) self.assertEqual( self._select("SELECT 1 UNION ALL (SELECT 1 UNION ALL SELECT 1) UNION ALL SELECT 1"), - f"SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS}", + f"SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS} UNION ALL (SELECT 1 UNION ALL SELECT 1) UNION ALL SELECT 1 LIMIT {MAX_SELECT_RETURNED_ROWS}", ) self.assertEqual( self._select("SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1"), diff --git a/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr b/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr index 06e46e0ca30b0..f018e96ef067a 100644 --- a/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr +++ b/posthog/hogql/transforms/test/__snapshots__/test_in_cohort.ambr @@ -31,7 +31,7 @@ FROM events LEFT JOIN ( SELECT person_static_cohort.person_id AS cohort_person_id, 1 AS matched, person_static_cohort.cohort_id AS cohort_id FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [6]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) + WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [4]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) WHERE and(equals(events.team_id, 420), 1, ifNull(equals(__in_cohort.matched, 1), 0)) LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, format_csv_allow_double_quotes=0, max_ast_elements=4000000, max_expanded_ast_elements=4000000, max_bytes_before_external_group_by=0 @@ -42,7 +42,7 @@ FROM events LEFT JOIN ( SELECT person_id AS cohort_person_id, 1 AS matched, cohort_id FROM static_cohort_people - WHERE in(cohort_id, [6])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) + WHERE in(cohort_id, [4])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) WHERE and(1, equals(__in_cohort.matched, 1)) LIMIT 100 ''' @@ -55,7 +55,7 @@ FROM events LEFT JOIN ( SELECT person_static_cohort.person_id AS cohort_person_id, 1 AS matched, person_static_cohort.cohort_id AS cohort_id FROM person_static_cohort - WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [7]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) + WHERE and(equals(person_static_cohort.team_id, 420), in(person_static_cohort.cohort_id, [5]))) AS __in_cohort ON equals(__in_cohort.cohort_person_id, events.person_id) WHERE and(equals(events.team_id, 420), 1, ifNull(equals(__in_cohort.matched, 1), 0)) LIMIT 100 SETTINGS readonly=2, max_execution_time=60, allow_experimental_object_type=1, format_csv_allow_double_quotes=0, max_ast_elements=4000000, max_expanded_ast_elements=4000000, max_bytes_before_external_group_by=0 @@ -66,7 +66,7 @@ FROM events LEFT JOIN ( SELECT person_id AS cohort_person_id, 1 AS matched, cohort_id FROM static_cohort_people - WHERE in(cohort_id, [7])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) + WHERE in(cohort_id, [5])) AS __in_cohort ON equals(__in_cohort.cohort_person_id, person_id) WHERE and(1, equals(__in_cohort.matched, 1)) LIMIT 100 ''' diff --git a/posthog/hogql/visitor.py b/posthog/hogql/visitor.py index 565346a169137..6b763b1d0812c 100644 --- a/posthog/hogql/visitor.py +++ b/posthog/hogql/visitor.py @@ -2,6 +2,7 @@ from typing import Optional, TypeVar, Generic, Any from posthog.hogql import ast +from posthog.hogql.ast import SelectSetNode from posthog.hogql.base import AST, Expr from posthog.hogql.errors import BaseHogQLError @@ -151,9 +152,10 @@ def visit_select_query(self, node: ast.SelectQuery): for expr in (node.window_exprs or {}).values(): self.visit(expr) - def visit_select_union_query(self, node: ast.SelectUnionQuery): - for expr in node.select_queries: - self.visit(expr) + def visit_select_set_query(self, node: ast.SelectSetQuery): + self.visit(node.initial_select_query) + for expr in node.subsequent_select_queries: + self.visit(expr.select_query) def visit_lambda_argument_type(self, node: ast.LambdaArgumentType): pass @@ -174,7 +176,7 @@ def visit_select_query_type(self, node: ast.SelectQueryType): for expr in node.columns.values(): self.visit(expr) - def visit_select_union_query_type(self, node: ast.SelectUnionQueryType): + def visit_select_set_query_type(self, node: ast.SelectSetQueryType): for type in node.types: self.visit(type) @@ -600,12 +602,16 @@ def visit_select_query(self, node: ast.SelectQuery): view_name=node.view_name, ) - def visit_select_union_query(self, node: ast.SelectUnionQuery): - return ast.SelectUnionQuery( + def visit_select_set_query(self, node: ast.SelectSetQuery): + return ast.SelectSetQuery( start=None if self.clear_locations else node.start, end=None if self.clear_locations else node.end, type=None if self.clear_types else node.type, - select_queries=[self.visit(expr) for expr in node.select_queries], + initial_select_query=self.visit(node.initial_select_query), + subsequent_select_queries=[ + SelectSetNode(set_operator=expr.set_operator, select_query=self.visit(expr.select_query)) + for expr in node.subsequent_select_queries + ], ) def visit_window_expr(self, node: ast.WindowExpr): diff --git a/posthog/hogql_queries/actors_query_runner.py b/posthog/hogql_queries/actors_query_runner.py index ba7301b5e0c51..cec4b7019f212 100644 --- a/posthog/hogql_queries/actors_query_runner.py +++ b/posthog/hogql_queries/actors_query_runner.py @@ -6,6 +6,7 @@ from posthog.hogql.constants import HogQLGlobalSettings from posthog.hogql.parser import parse_expr, parse_order_expr from posthog.hogql.property import has_aggregation +from posthog.hogql.resolver_utils import extract_select_queries from posthog.hogql_queries.actor_strategies import ActorStrategy, PersonStrategy, GroupStrategy from posthog.hogql_queries.insights.funnels.funnels_query_runner import FunnelsQueryRunner from posthog.hogql_queries.insights.insight_actors_query_runner import InsightActorsQueryRunner @@ -142,12 +143,12 @@ def input_columns(self) -> list[str]: return self.strategy.input_columns() # TODO: Figure out a more sure way of getting the actor id than using the alias or chain name - def source_id_column(self, source_query: ast.SelectQuery | ast.SelectUnionQuery) -> list[str]: + def source_id_column(self, source_query: ast.SelectQuery | ast.SelectSetQuery) -> list[str]: # Figure out the id column of the source query, first column that has id in the name if isinstance(source_query, ast.SelectQuery): select = source_query.select else: - select = source_query.select_queries[0].select + select = next(extract_select_queries(source_query)).select for column in select: if isinstance(column, ast.Alias) and (column.alias in ("group_key", "actor_id", "person_id")): diff --git a/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py b/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py index 1fdd2be57db54..167d1100f1558 100644 --- a/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py +++ b/posthog/hogql_queries/ai/actors_property_taxonomy_query_runner.py @@ -49,7 +49,7 @@ def calculate(self): modifiers=self.modifiers, ) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: query = ast.SelectQuery( select=[ ast.Call(name="groupArray", args=[ast.Field(chain=["prop"])], params=[ast.Constant(value=5)]), diff --git a/posthog/hogql_queries/ai/event_taxonomy_query_runner.py b/posthog/hogql_queries/ai/event_taxonomy_query_runner.py index 17677d23fa5d2..c00f2a4f771c4 100644 --- a/posthog/hogql_queries/ai/event_taxonomy_query_runner.py +++ b/posthog/hogql_queries/ai/event_taxonomy_query_runner.py @@ -49,7 +49,7 @@ def calculate(self): modifiers=self.modifiers, ) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: query = parse_select( """ SELECT diff --git a/posthog/hogql_queries/ai/team_taxonomy_query_runner.py b/posthog/hogql_queries/ai/team_taxonomy_query_runner.py index e4c0823616898..17314fb0c74a8 100644 --- a/posthog/hogql_queries/ai/team_taxonomy_query_runner.py +++ b/posthog/hogql_queries/ai/team_taxonomy_query_runner.py @@ -43,7 +43,7 @@ def calculate(self): results=results, timings=response.timings, hogql=hogql, modifiers=self.modifiers ) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: query = parse_select( """ SELECT diff --git a/posthog/hogql_queries/insights/funnels/base.py b/posthog/hogql_queries/insights/funnels/base.py index 9ddc1b4f26af2..87d7c2a4b0597 100644 --- a/posthog/hogql_queries/insights/funnels/base.py +++ b/posthog/hogql_queries/insights/funnels/base.py @@ -532,7 +532,7 @@ def _get_cohort_breakdown_join(self) -> ast.JoinExpr: return ast.JoinExpr( join_type="INNER JOIN", - table=ast.SelectUnionQuery(select_queries=cohort_queries), + table=ast.SelectSetQuery.create_from_queries(cohort_queries, "UNION ALL"), alias="cohort_join", constraint=ast.JoinConstraint( expr=ast.CompareOperation( diff --git a/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py b/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py index a633941817af0..f218976ad941c 100644 --- a/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py +++ b/posthog/hogql_queries/insights/funnels/funnel_correlation_query_runner.py @@ -332,7 +332,7 @@ def serialize_event_with_property(self, event: str) -> EventDefinition: return EventDefinition(event=event, properties={}, elements=[]) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: """ Returns a query string and params, which are used to generate the contingency table. The query returns success and failure count for event / property values, along with total success and failure counts. @@ -345,7 +345,7 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: return self.get_event_query() - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: assert self.correlation_actors_query is not None if self.query.funnelCorrelationType == FunnelCorrelationResultsType.PROPERTIES: @@ -362,7 +362,7 @@ def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: else: return self.events_actor_query() - def events_actor_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def events_actor_query(self) -> ast.SelectQuery | ast.SelectSetQuery: assert self.correlation_actors_query is not None if not self.correlation_actors_query.funnelCorrelationPersonEntity: @@ -431,7 +431,7 @@ def events_actor_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: def properties_actor_query( self, - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: assert self.correlation_actors_query is not None if not self.correlation_actors_query.funnelCorrelationPropertyValues: @@ -470,7 +470,7 @@ def properties_actor_query( return query - def get_event_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_event_query(self) -> ast.SelectQuery | ast.SelectSetQuery: funnel_persons_query = self.get_funnel_actors_cte() event_join_query = self._get_events_join_query() target_step = self.context.max_steps @@ -548,7 +548,7 @@ def get_event_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: return event_correlation_query - def get_event_property_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_event_property_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if not self.query.funnelCorrelationEventNames: raise ValidationError("Event Property Correlation expects atleast one event name to run correlation on") @@ -646,7 +646,7 @@ def get_event_property_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: return query - def get_properties_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_properties_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if not self.query.funnelCorrelationNames: raise ValidationError("Property Correlation expects atleast one Property to run correlation on") diff --git a/posthog/hogql_queries/insights/funnels/funnel_unordered.py b/posthog/hogql_queries/insights/funnels/funnel_unordered.py index f718c7fe3e4df..8d39428c02449 100644 --- a/posthog/hogql_queries/insights/funnels/funnel_unordered.py +++ b/posthog/hogql_queries/insights/funnels/funnel_unordered.py @@ -115,7 +115,7 @@ def get_step_counts_without_aggregation_query(self): entities_to_use.append(entities_to_use.pop(0)) union_queries.append(formatted_query) - return ast.SelectUnionQuery(select_queries=union_queries) + return ast.SelectSetQuery.create_from_queries(union_queries, "UNION ALL") def _get_step_times(self, max_steps: int) -> list[ast.Expr]: windowInterval = self.context.funnelWindowInterval diff --git a/posthog/hogql_queries/insights/funnels/funnels_query_runner.py b/posthog/hogql_queries/insights/funnels/funnels_query_runner.py index 0e8a7919a76ec..ebafdace3acbc 100644 --- a/posthog/hogql_queries/insights/funnels/funnels_query_runner.py +++ b/posthog/hogql_queries/insights/funnels/funnels_query_runner.py @@ -76,7 +76,7 @@ def _refresh_frequency(self): def to_query(self) -> ast.SelectQuery: return self.funnel_class.get_query() - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return self.funnel_actor_class.actor_query() def calculate(self): diff --git a/posthog/hogql_queries/insights/insight_actors_query_options_runner.py b/posthog/hogql_queries/insights/insight_actors_query_options_runner.py index 81cf2895d8c43..cb14a284774a0 100644 --- a/posthog/hogql_queries/insights/insight_actors_query_options_runner.py +++ b/posthog/hogql_queries/insights/insight_actors_query_options_runner.py @@ -21,7 +21,7 @@ class InsightActorsQueryOptionsRunner(QueryRunner): def source_runner(self) -> QueryRunner: return get_query_runner(self.query.source.source, self.team, self.timings, self.limit_context) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: raise ValueError(f"Cannot convert source query of type {self.query.source.kind} to query") def calculate(self) -> InsightActorsQueryOptionsResponse: diff --git a/posthog/hogql_queries/insights/insight_actors_query_runner.py b/posthog/hogql_queries/insights/insight_actors_query_runner.py index c07c1e3687ab0..cc6ddca0fd0fd 100644 --- a/posthog/hogql_queries/insights/insight_actors_query_runner.py +++ b/posthog/hogql_queries/insights/insight_actors_query_runner.py @@ -33,7 +33,7 @@ class InsightActorsQueryRunner(QueryRunner): def source_runner(self) -> QueryRunner: return get_query_runner(self.query.source, self.team, self.timings, self.limit_context, self.modifiers) - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if isinstance(self.source_runner, TrendsQueryRunner): trends_runner = cast(TrendsQueryRunner, self.source_runner) query = cast(InsightActorsQuery, self.query) @@ -73,7 +73,7 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: raise ValueError(f"Cannot convert source query of type {self.query.source.kind} to persons query") - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return self.to_query() @property diff --git a/posthog/hogql_queries/insights/lifecycle_query_runner.py b/posthog/hogql_queries/insights/lifecycle_query_runner.py index 1aaf3db5d01c7..d691074d3a032 100644 --- a/posthog/hogql_queries/insights/lifecycle_query_runner.py +++ b/posthog/hogql_queries/insights/lifecycle_query_runner.py @@ -33,7 +33,7 @@ class LifecycleQueryRunner(QueryRunner): response: LifecycleQueryResponse cached_response: CachedLifecycleQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: if self.query.samplingFactor == 0: counts_with_sampling = ast.Constant(value=0) elif self.query.samplingFactor is not None and self.query.samplingFactor != 1: @@ -95,7 +95,7 @@ def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: def to_actors_query( self, day: Optional[str] = None, status: Optional[str] = None - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("actors_query"): exprs = [] if day is not None: diff --git a/posthog/hogql_queries/insights/paths_query_runner.py b/posthog/hogql_queries/insights/paths_query_runner.py index dfacf5e90665f..09ad850140ef0 100644 --- a/posthog/hogql_queries/insights/paths_query_runner.py +++ b/posthog/hogql_queries/insights/paths_query_runner.py @@ -750,7 +750,7 @@ def get_edge_weight_exprs(self) -> list[ast.Expr]: ) return conditions - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: placeholders: dict[str, ast.Expr] = { "paths_per_person_query": self.paths_per_person_query(), } @@ -876,7 +876,7 @@ def calculate(self) -> PathsQueryResponse: def extra_event_fields_and_properties(self) -> list[str]: return self.extra_event_fields + self.extra_event_properties - def to_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: # To include matching_events, we need to add extra fields and properties # TODO: Make sure going via self is the best way to do this self.extra_event_fields = ["uuid", "timestamp"] diff --git a/posthog/hogql_queries/insights/retention_query_runner.py b/posthog/hogql_queries/insights/retention_query_runner.py index 9f96ef654199b..5f1fbd57b4d95 100644 --- a/posthog/hogql_queries/insights/retention_query_runner.py +++ b/posthog/hogql_queries/insights/retention_query_runner.py @@ -316,7 +316,7 @@ def actor_query(self, breakdown_values_filter: Optional[int] = None, cumulative: return inner_query - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("retention_query"): if self.query.retentionFilter.cumulative: actor_query = parse_select( diff --git a/posthog/hogql_queries/insights/stickiness_query_runner.py b/posthog/hogql_queries/insights/stickiness_query_runner.py index f0fc017165e8d..43928a4bd90e6 100644 --- a/posthog/hogql_queries/insights/stickiness_query_runner.py +++ b/posthog/hogql_queries/insights/stickiness_query_runner.py @@ -128,8 +128,8 @@ def _events_query(self, series_with_extra: SeriesWithExtras) -> ast.SelectQuery: return cast(ast.SelectQuery, select_query) - def to_query(self) -> ast.SelectUnionQuery: - return ast.SelectUnionQuery(select_queries=self.to_queries()) + def to_query(self) -> ast.SelectSetQuery: + return ast.SelectSetQuery.create_from_queries(self.to_queries(), "UNION ALL") def to_queries(self) -> list[ast.SelectQuery]: queries = [] @@ -170,7 +170,7 @@ def to_queries(self) -> list[ast.SelectQuery]: return queries - def to_actors_query(self, interval_num: Optional[int] = None) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self, interval_num: Optional[int] = None) -> ast.SelectQuery | ast.SelectSetQuery: queries: list[ast.SelectQuery] = [] for series in self.series: @@ -194,7 +194,7 @@ def to_actors_query(self, interval_num: Optional[int] = None) -> ast.SelectQuery queries.append(events_query) - return ast.SelectUnionQuery(select_queries=queries) + return ast.SelectSetQuery.create_from_queries(queries, "UNION ALL") def calculate(self): queries = self.to_queries() diff --git a/posthog/hogql_queries/insights/trends/aggregation_operations.py b/posthog/hogql_queries/insights/trends/aggregation_operations.py index bea5230e45a1a..84e7c181f7c13 100644 --- a/posthog/hogql_queries/insights/trends/aggregation_operations.py +++ b/posthog/hogql_queries/insights/trends/aggregation_operations.py @@ -187,8 +187,8 @@ def _interval_function_name(self) -> str: return f"toStartOf{self.query_date_range.interval_name.title()}" def _actors_parent_select_query( - self, inner_query: ast.SelectQuery | ast.SelectUnionQuery - ) -> ast.SelectQuery | ast.SelectUnionQuery: + self, inner_query: ast.SelectQuery | ast.SelectSetQuery + ) -> ast.SelectQuery | ast.SelectSetQuery: if self.is_count_per_actor_variant(): query = parse_select( "SELECT total FROM {inner_query}", @@ -232,8 +232,8 @@ def _actors_parent_select_query( return query def _actors_inner_select_query( - self, cross_join_select_query: ast.SelectQuery | ast.SelectUnionQuery - ) -> ast.SelectQuery | ast.SelectUnionQuery: + self, cross_join_select_query: ast.SelectQuery | ast.SelectSetQuery + ) -> ast.SelectQuery | ast.SelectSetQuery: if self.is_count_per_actor_variant(): if self.series.math == "avg_count_per_actor": math_func = self._math_func("avg", ["total"]) @@ -308,7 +308,7 @@ def _actors_inner_select_query( def _actors_events_query( self, events_where_clause: ast.Expr, sample_value: ast.RatioExpr - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: date_from_with_lookback = "{date_from} - {inclusive_lookback}" if self.chart_display_type in NON_TIME_SERIES_DISPLAY_TYPES and self.series.math in ( BaseMathType.WEEKLY_ACTIVE, diff --git a/posthog/hogql_queries/insights/trends/display.py b/posthog/hogql_queries/insights/trends/display.py index 4a1229e7ba9c2..17d63daace954 100644 --- a/posthog/hogql_queries/insights/trends/display.py +++ b/posthog/hogql_queries/insights/trends/display.py @@ -31,7 +31,7 @@ def wrap_inner_query(self, inner_query: ast.SelectQuery, breakdown_enabled: bool def should_wrap_inner_query(self) -> bool: return self.display_type == ChartDisplayType.ACTIONS_LINE_GRAPH_CUMULATIVE - def _build_aggregate_dates(self, dates_queries: ast.SelectUnionQuery) -> ast.Expr: + def _build_aggregate_dates(self, dates_queries: ast.SelectSetQuery) -> ast.Expr: return parse_select( """ SELECT day_start @@ -49,7 +49,7 @@ def _build_aggregate_dates(self, dates_queries: ast.SelectUnionQuery) -> ast.Exp ) def modify_outer_query( - self, outer_query: ast.SelectQuery, inner_query: ast.SelectQuery, dates_queries: ast.SelectUnionQuery + self, outer_query: ast.SelectQuery, inner_query: ast.SelectQuery, dates_queries: ast.SelectSetQuery ) -> ast.SelectQuery: if not self.is_total_value(): return outer_query diff --git a/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr b/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr index 4ae57feb8cb96..6027f7ca7bb42 100644 --- a/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr +++ b/posthog/hogql_queries/insights/trends/test/__snapshots__/test_trends.ambr @@ -851,49 +851,14 @@ # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.1 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - breakdown_value AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value) - GROUP BY day_start, - breakdown_value - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE isNotNull(breakdown_value) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.10 @@ -1110,143 +1075,38 @@ # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.2 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - breakdown_value AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value) - GROUP BY day_start, - breakdown_value - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE isNotNull(breakdown_value) - GROUP BY breakdown_value - ORDER BY if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_other_$$'), 0), 2, if(ifNull(equals(breakdown_value, '$$_posthog_breakdown_null_$$'), 0), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.3 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - arrayMap(i -> if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', i), breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - [ifNull(toString(breakdown_value_1), '$$_posthog_breakdown_null_$$')] AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value_1 - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value_1) - GROUP BY day_start, - breakdown_value_1 - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE arrayExists(x -> isNotNull(x), breakdown_value) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.4 ''' - SELECT groupArray(1)(date)[1] AS date, - arrayFold((acc, x) -> arrayMap(i -> plus(acc[i], x[i]), range(1, plus(length(date), 1))), groupArray(ifNull(total, 0)), arrayWithConstant(length(date), reinterpretAsFloat64(0))) AS total, - arrayMap(i -> if(ifNull(ifNull(greaterOrEquals(row_number, 25), 0), 0), '$$_posthog_breakdown_other_$$', i), breakdown_value) AS breakdown_value - FROM - (SELECT arrayMap(number -> plus(toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toIntervalDay(number)), range(0, plus(coalesce(dateDiff('day', toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC'))), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))))), 1))) AS date, - arrayMap(_match_date -> arraySum(arraySlice(groupArray(ifNull(count, 0)), indexOf(groupArray(day_start) AS _days_for_count, _match_date) AS _index, plus(minus(arrayLastIndex(x -> ifNull(equals(x, _match_date), isNull(x) - and isNull(_match_date)), _days_for_count), _index), 1))), date) AS total, - breakdown_value AS breakdown_value, - rowNumberInAllBlocks() AS row_number - FROM - (SELECT sum(total) AS count, - day_start AS day_start, - [ifNull(toString(breakdown_value_1), '$$_posthog_breakdown_null_$$')] AS breakdown_value - FROM - (SELECT count(DISTINCT if(not(empty(e__override.distinct_id)), e__override.person_id, e.person_id)) AS total, - toStartOfDay(toTimeZone(e.timestamp, 'UTC')) AS day_start, - ifNull(nullIf(toString(replaceRegexpAll(nullIf(nullIf(JSONExtractRaw(e.properties, '$some_property'), ''), 'null'), '^"|"$', '')), ''), '$$_posthog_breakdown_null_$$') AS breakdown_value_1 - FROM events AS e SAMPLE 1.0 - LEFT OUTER JOIN - (SELECT argMax(person_distinct_id_overrides.person_id, person_distinct_id_overrides.version) AS person_id, - person_distinct_id_overrides.distinct_id AS distinct_id - FROM person_distinct_id_overrides - WHERE equals(person_distinct_id_overrides.team_id, 2) - GROUP BY person_distinct_id_overrides.distinct_id - HAVING ifNull(equals(argMax(person_distinct_id_overrides.is_deleted, person_distinct_id_overrides.version), 0), 0) SETTINGS optimize_aggregation_in_order=1) AS e__override ON equals(e.distinct_id, e__override.distinct_id) - WHERE and(equals(e.team_id, 2), greaterOrEquals(toTimeZone(e.timestamp, 'UTC'), toStartOfDay(assumeNotNull(parseDateTime64BestEffortOrNull('2019-12-28 00:00:00', 6, 'UTC')))), lessOrEquals(toTimeZone(e.timestamp, 'UTC'), assumeNotNull(parseDateTime64BestEffortOrNull('2020-01-04 23:59:59', 6, 'UTC'))), equals(e.event, 'sign up')) - GROUP BY day_start, - breakdown_value_1) - GROUP BY day_start, - breakdown_value_1 - ORDER BY day_start ASC, breakdown_value ASC) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC) - WHERE arrayExists(x -> isNotNull(x), breakdown_value) - GROUP BY breakdown_value - ORDER BY if(has(breakdown_value, '$$_posthog_breakdown_other_$$'), 2, if(has(breakdown_value, '$$_posthog_breakdown_null_$$'), 1, 0)) ASC, arraySum(total) DESC, breakdown_value ASC - LIMIT 50000 SETTINGS readonly=2, - max_execution_time=60, - allow_experimental_object_type=1, - format_csv_allow_double_quotes=0, - max_ast_elements=4000000, - max_expanded_ast_elements=4000000, - max_bytes_before_external_group_by=0 + /* celery:posthog.tasks.tasks.sync_insight_caching_state */ + SELECT team_id, + date_diff('second', max(timestamp), now()) AS age + FROM events + WHERE timestamp > date_sub(DAY, 3, now()) + AND timestamp < now() + GROUP BY team_id + ORDER BY age; ''' # --- # name: TestTrends.test_dau_with_breakdown_filtering_with_sampling.5 diff --git a/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py b/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py index 84f97da6e0c40..5cb5d2f669449 100644 --- a/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py +++ b/posthog/hogql_queries/insights/trends/trends_actors_query_builder.py @@ -167,7 +167,7 @@ def is_explicit(self) -> bool: def is_total_value(self) -> bool: return self.trends_display.is_total_value() - def build_actors_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def build_actors_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return ast.SelectQuery( select=[ ast.Field(chain=["actor_id"]), diff --git a/posthog/hogql_queries/insights/trends/trends_query_builder.py b/posthog/hogql_queries/insights/trends/trends_query_builder.py index ee1165c41c624..ebc6f91d20186 100644 --- a/posthog/hogql_queries/insights/trends/trends_query_builder.py +++ b/posthog/hogql_queries/insights/trends/trends_query_builder.py @@ -60,7 +60,7 @@ def __init__( self.modifiers = modifiers self.limit_context = limit_context - def build_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def build_query(self) -> ast.SelectQuery | ast.SelectSetQuery: breakdown = self.breakdown events_query = self._get_events_subquery(False, is_actors_query=False, breakdown=breakdown) @@ -73,7 +73,7 @@ def build_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: def _get_wrapper_query( self, events_query: ast.SelectQuery, breakdown: Breakdown - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: if not breakdown.enabled: return events_query @@ -312,7 +312,7 @@ def _get_events_subquery( def _outer_select_query( self, breakdown: Breakdown, inner_query: ast.SelectQuery - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: total_array = parse_expr( """ arrayMap( @@ -453,7 +453,7 @@ def _get_breakdown_limit(self) -> int: ) or get_breakdown_limit_for_context(self.limit_context) def _inner_select_query( - self, breakdown: Breakdown, inner_query: ast.SelectQuery | ast.SelectUnionQuery + self, breakdown: Breakdown, inner_query: ast.SelectQuery | ast.SelectSetQuery ) -> ast.SelectQuery: query = cast( ast.SelectQuery, diff --git a/posthog/hogql_queries/insights/trends/trends_query_runner.py b/posthog/hogql_queries/insights/trends/trends_query_runner.py index 44cbf4cd5da0c..831adda7d5f14 100644 --- a/posthog/hogql_queries/insights/trends/trends_query_runner.py +++ b/posthog/hogql_queries/insights/trends/trends_query_runner.py @@ -110,16 +110,10 @@ def _refresh_frequency(self): return BASE_MINIMUM_INSIGHT_REFRESH_INTERVAL - def to_query(self) -> ast.SelectUnionQuery: - queries = [] - for query in self.to_queries(): - if isinstance(query, ast.SelectQuery): - queries.append(query) - else: - queries.extend(query.select_queries) - return ast.SelectUnionQuery(select_queries=queries) + def to_query(self) -> ast.SelectSetQuery: + return ast.SelectSetQuery.create_from_queries(self.to_queries(), "UNION ALL") - def to_queries(self) -> list[ast.SelectQuery | ast.SelectUnionQuery]: + def to_queries(self) -> list[ast.SelectQuery | ast.SelectSetQuery]: queries = [] with self.timings.measure("trends_to_query"): for series in self.series: @@ -154,7 +148,7 @@ def to_actors_query( breakdown_value: Optional[str | int | list[str]] = None, compare_value: Optional[Compare] = None, include_recordings: Optional[bool] = None, - ) -> ast.SelectQuery | ast.SelectUnionQuery: + ) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("trends_to_actors_query"): if self.query.breakdownFilter and self.query.breakdownFilter.breakdown_type == BreakdownType.COHORT: if self.query.breakdownFilter.breakdown in ("all", ["all"]) or breakdown_value == "all": @@ -300,18 +294,16 @@ def to_actors_query_options(self) -> InsightActorsQueryOptionsResponse: def calculate(self): queries = self.to_queries() - if len(queries) == 1: - response_hogql_query = queries[0] + if len(queries) == 0: + response_hogql = "" else: - response_hogql_query = ast.SelectUnionQuery(select_queries=[]) - for query in queries: - if isinstance(query, ast.SelectQuery): - response_hogql_query.select_queries.append(query) - else: - response_hogql_query.select_queries.extend(query.select_queries) + if len(queries) == 1: + response_hogql_query = queries[0] + else: + response_hogql_query = ast.SelectSetQuery.create_from_queries(queries, "UNION ALL") - with self.timings.measure("printing_hogql_for_response"): - response_hogql = to_printed_hogql(response_hogql_query, self.team, self.modifiers) + with self.timings.measure("printing_hogql_for_response"): + response_hogql = to_printed_hogql(response_hogql_query, self.team, self.modifiers) res_matrix: list[list[Any] | Any | None] = [None] * len(queries) timings_matrix: list[list[QueryTiming] | None] = [None] * (2 + len(queries)) @@ -320,7 +312,7 @@ def calculate(self): def run( index: int, - query: ast.SelectQuery | ast.SelectUnionQuery, + query: ast.SelectQuery | ast.SelectSetQuery, timings: HogQLTimings, is_parallel: bool, query_tags: Optional[dict] = None, diff --git a/posthog/hogql_queries/insights/utils/aggregations.py b/posthog/hogql_queries/insights/utils/aggregations.py index 084ee58905c20..cb4fd72377759 100644 --- a/posthog/hogql_queries/insights/utils/aggregations.py +++ b/posthog/hogql_queries/insights/utils/aggregations.py @@ -11,7 +11,7 @@ class QueryAlternator: _group_bys: list[ast.Expr] _select_from: ast.JoinExpr | None - def __init__(self, query: ast.SelectQuery | ast.SelectUnionQuery): + def __init__(self, query: ast.SelectQuery | ast.SelectSetQuery): assert isinstance(query, ast.SelectQuery) self._query = query @@ -19,7 +19,7 @@ def __init__(self, query: ast.SelectQuery | ast.SelectUnionQuery): self._group_bys = [] self._select_from = None - def build(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def build(self) -> ast.SelectQuery | ast.SelectSetQuery: if len(self._selects) > 0: self._query.select.extend(self._selects) diff --git a/posthog/hogql_queries/query_runner.py b/posthog/hogql_queries/query_runner.py index 44d5abfe3c16c..4c13f82346011 100644 --- a/posthog/hogql_queries/query_runner.py +++ b/posthog/hogql_queries/query_runner.py @@ -708,10 +708,10 @@ def run( return fresh_response @abstractmethod - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: raise NotImplementedError() - def to_actors_query(self, *args, **kwargs) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_actors_query(self, *args, **kwargs) -> ast.SelectQuery | ast.SelectSetQuery: # TODO: add support for selecting and filtering by breakdowns raise NotImplementedError() diff --git a/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py b/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py index d285ff2aa25f3..06ba1ddfeabbe 100644 --- a/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py +++ b/posthog/hogql_queries/web_analytics/test/test_session_attribution_explorer_query_runner.py @@ -1,6 +1,5 @@ from typing import Optional -from parameterized import parameterized from posthog.hogql.constants import LimitContext from posthog.hogql_queries.web_analytics.session_attribution_explorer_query_runner import ( @@ -80,7 +79,7 @@ def _run_session_attribution_query( self, date_from: Optional[str] = None, date_to: Optional[str] = None, - session_table_version: SessionTableVersion = SessionTableVersion.V1, + session_table_version: SessionTableVersion = SessionTableVersion.V2, group_by: Optional[list[SessionAttributionGroupBy]] = None, limit_context: Optional[LimitContext] = None, properties: Optional[list[SessionPropertyFilter]] = None, @@ -94,20 +93,14 @@ def _run_session_attribution_query( runner = SessionAttributionExplorerQueryRunner(team=self.team, query=query, limit_context=limit_context) return runner.calculate() - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion): - results = self._run_session_attribution_query( - session_table_version=session_table_version, - ).results + def test_no_crash_when_no_data(self): + results = self._run_session_attribution_query().results assert results == [(0, [], [], [], [], [], [], [])] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_group_by_nothing(self, session_table_version: SessionTableVersion): + def test_group_by_nothing(self): self._create_data() - results = self._run_session_attribution_query( - session_table_version=session_table_version, - ).results + results = self._run_session_attribution_query().results assert results == [ ( @@ -122,12 +115,10 @@ def test_group_by_nothing(self, session_table_version: SessionTableVersion): ) ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_group_by_initial_url(self, session_table_version: SessionTableVersion): + def test_group_by_initial_url(self): self._create_data() results = self._run_session_attribution_query( - session_table_version=session_table_version, group_by=[SessionAttributionGroupBy.INITIAL_URL], ).results @@ -164,12 +155,10 @@ def test_group_by_initial_url(self, session_table_version: SessionTableVersion): ), ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_group_channel_medium_source(self, session_table_version: SessionTableVersion): + def test_group_channel_medium_source(self): self._create_data() results = self._run_session_attribution_query( - session_table_version=session_table_version, group_by=[ SessionAttributionGroupBy.CHANNEL_TYPE, SessionAttributionGroupBy.MEDIUM, @@ -191,12 +180,10 @@ def test_group_channel_medium_source(self, session_table_version: SessionTableVe (1, "Referral", ["referring_domain2"], "source2", "medium2", ["campaign2"], [], ["http://example.com/2"]), ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_filters(self, session_table_version: SessionTableVersion): + def test_filters(self): self._create_data() results = self._run_session_attribution_query( - session_table_version=session_table_version, group_by=[ SessionAttributionGroupBy.CHANNEL_TYPE, SessionAttributionGroupBy.MEDIUM, diff --git a/posthog/hogql_queries/web_analytics/test/test_web_overview.py b/posthog/hogql_queries/web_analytics/test/test_web_overview.py index bc41d4d0a6785..3e9b570f57b9e 100644 --- a/posthog/hogql_queries/web_analytics/test/test_web_overview.py +++ b/posthog/hogql_queries/web_analytics/test/test_web_overview.py @@ -2,7 +2,6 @@ from unittest.mock import MagicMock, patch from freezegun import freeze_time -from parameterized import parameterized from posthog.clickhouse.client.execute import sync_execute from posthog.hogql.constants import LimitContext @@ -72,7 +71,7 @@ def _run_web_overview_query( self, date_from: str, date_to: str, - session_table_version: SessionTableVersion = SessionTableVersion.V1, + session_table_version: SessionTableVersion = SessionTableVersion.V2, compare: bool = True, limit_context: Optional[LimitContext] = None, filter_test_accounts: Optional[bool] = False, @@ -97,19 +96,16 @@ def _run_web_overview_query( runner = WebOverviewQueryRunner(team=self.team, query=query, limit_context=limit_context) return runner.calculate() - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion): + def test_no_crash_when_no_data(self): results = self._run_web_overview_query( "2023-12-08", "2023-12-15", - session_table_version=session_table_version, ).results assert [item.key for item in results] == ["visitors", "views", "sessions", "session duration", "bounce rate"] results = self._run_web_overview_query( "2023-12-08", "2023-12-15", - session_table_version=session_table_version, includeLCPScore=True, ).results assert [item.key for item in results] == [ @@ -132,9 +128,7 @@ def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion) } ], ) - results = self._run_web_overview_query( - "2023-12-08", "2023-12-15", session_table_version=session_table_version, action=action - ).results + results = self._run_web_overview_query("2023-12-08", "2023-12-15", action=action).results assert [item.key for item in results] == [ "visitors", @@ -143,8 +137,7 @@ def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion) "conversion rate", ] - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_increase_in_users(self, session_table_version: SessionTableVersion): + def test_increase_in_users(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-12")) s2 = str(uuid7("2023-12-11")) @@ -159,7 +152,6 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): results = self._run_web_overview_query( "2023-12-08", "2023-12-15", - session_table_version=session_table_version, ).results visitors = results[0] @@ -192,8 +184,7 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): self.assertEqual(0, bounce.previous) self.assertEqual(None, bounce.changeFromPreviousPct) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_all_time(self, session_table_version: SessionTableVersion): + def test_all_time(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-12")) s2 = str(uuid7("2023-12-11")) @@ -208,7 +199,6 @@ def test_all_time(self, session_table_version: SessionTableVersion): "all", "2023-12-15", compare=False, - session_table_version=session_table_version, ).results visitors = results[0] @@ -241,15 +231,12 @@ def test_all_time(self, session_table_version: SessionTableVersion): self.assertEqual(None, bounce.previous) self.assertEqual(None, bounce.changeFromPreviousPct) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1), ("2023-12-03", s1)])]) - results = self._run_web_overview_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=True - ).results + results = self._run_web_overview_query("2023-12-01", "2023-12-03", filter_test_accounts=True).results visitors = results[0] self.assertEqual(0, visitors.value) @@ -267,21 +254,17 @@ def test_filter_test_accounts(self, session_table_version: SessionTableVersion): self.assertEqual("bounce rate", bounce.key) self.assertEqual(None, bounce.value) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_dont_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_dont_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1), ("2023-12-03", s1)])]) - results = self._run_web_overview_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=False - ).results + results = self._run_web_overview_query("2023-12-01", "2023-12-03", filter_test_accounts=False).results visitors = results[0] self.assertEqual(1, visitors.value) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_correctly_counts_pageviews_in_long_running_session(self, session_table_version: SessionTableVersion): + def test_correctly_counts_pageviews_in_long_running_session(self): # this test is important when using the v1 sessions table as the raw sessions table will have 3 entries, one per day s1 = str(uuid7("2023-12-01")) self._create_events( @@ -293,7 +276,6 @@ def test_correctly_counts_pageviews_in_long_running_session(self, session_table_ results = self._run_web_overview_query( "2023-12-01", "2023-12-03", - session_table_version=session_table_version, ).results visitors = results[0] diff --git a/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py b/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py index 10ce9ab1ebcb4..865424f5bc862 100644 --- a/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py +++ b/posthog/hogql_queries/web_analytics/test/test_web_stats_table.py @@ -1,7 +1,6 @@ from typing import Optional from freezegun import freeze_time -from parameterized import parameterized from posthog.hogql_queries.web_analytics.stats_table import WebStatsTableQueryRunner from posthog.models import Cohort @@ -108,7 +107,7 @@ def _run_web_stats_table_query( include_bounce_rate=False, include_scroll_depth=False, properties=None, - session_table_version: SessionTableVersion = SessionTableVersion.V1, + session_table_version: SessionTableVersion = SessionTableVersion.V2, filter_test_accounts: Optional[bool] = False, ): modifiers = HogQLQueryModifiers(sessionTableVersion=session_table_version) @@ -126,15 +125,14 @@ def _run_web_stats_table_query( runner = WebStatsTableQueryRunner(team=self.team, query=query, modifiers=modifiers) return runner.calculate() - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_no_crash_when_no_data(self, session_table_version: SessionTableVersion): + def test_no_crash_when_no_data(self): results = self._run_web_stats_table_query( - "2023-12-08", "2023-12-15", session_table_version=session_table_version + "2023-12-08", + "2023-12-15", ).results self.assertEqual([], results) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_increase_in_users(self, session_table_version: SessionTableVersion): + def test_increase_in_users(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-13")) s2 = str(uuid7("2023-12-10")) @@ -145,9 +143,7 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): ] ) - results = self._run_web_stats_table_query( - "2023-12-01", "2023-12-11", session_table_version=session_table_version - ).results + results = self._run_web_stats_table_query("2023-12-01", "2023-12-11").results self.assertEqual( [ @@ -157,8 +153,7 @@ def test_increase_in_users(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_all_time(self, session_table_version: SessionTableVersion): + def test_all_time(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-13")) s2 = str(uuid7("2023-12-10")) @@ -169,9 +164,7 @@ def test_all_time(self, session_table_version: SessionTableVersion): ] ) - results = self._run_web_stats_table_query( - "all", "2023-12-15", session_table_version=session_table_version - ).results + results = self._run_web_stats_table_query("all", "2023-12-15").results self.assertEqual( [ @@ -182,38 +175,31 @@ def test_all_time(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1, "/"), ("2023-12-03", s1, "/login")])]) - results = self._run_web_stats_table_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=True - ).results + results = self._run_web_stats_table_query("2023-12-01", "2023-12-03", filter_test_accounts=True).results self.assertEqual( [], results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_dont_filter_test_accounts(self, session_table_version: SessionTableVersion): + def test_dont_filter_test_accounts(self): s1 = str(uuid7("2023-12-02")) # Create 1 test account self._create_events([("test", [("2023-12-02", s1, "/"), ("2023-12-03", s1, "/login")])]) - results = self._run_web_stats_table_query( - "2023-12-01", "2023-12-03", session_table_version=session_table_version, filter_test_accounts=False - ).results + results = self._run_web_stats_table_query("2023-12-01", "2023-12-03", filter_test_accounts=False).results self.assertEqual( [["/", 1, 1], ["/login", 1, 1]], results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_breakdown_channel_type_doesnt_throw(self, session_table_version: SessionTableVersion): + def test_breakdown_channel_type_doesnt_throw(self): s1a = str(uuid7("2023-12-02")) s1b = str(uuid7("2023-12-13")) s2 = str(uuid7("2023-12-10")) @@ -229,7 +215,6 @@ def test_breakdown_channel_type_doesnt_throw(self, session_table_version: Sessio "2023-12-01", "2023-12-03", breakdown_by=WebStatsBreakdown.INITIAL_CHANNEL_TYPE, - session_table_version=session_table_version, ).results self.assertEqual( @@ -237,8 +222,7 @@ def test_breakdown_channel_type_doesnt_throw(self, session_table_version: Sessio len(results), ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_limit(self, session_table_version: SessionTableVersion): + def test_limit(self): s1 = str(uuid7("2023-12-02")) s2 = str(uuid7("2023-12-10")) self._create_events( @@ -248,9 +232,7 @@ def test_limit(self, session_table_version: SessionTableVersion): ] ) - response_1 = self._run_web_stats_table_query( - "all", "2023-12-15", limit=1, session_table_version=session_table_version - ) + response_1 = self._run_web_stats_table_query("all", "2023-12-15", limit=1) self.assertEqual( [ ["/", 2, 2], @@ -269,8 +251,7 @@ def test_limit(self, session_table_version: SessionTableVersion): ) self.assertEqual(False, response_2.hasMore) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_path_filters(self, session_table_version: SessionTableVersion): + def test_path_filters(self): s1 = str(uuid7("2023-12-02")) s2 = str(uuid7("2023-12-10")) s3 = str(uuid7("2023-12-10")) @@ -295,7 +276,6 @@ def test_path_filters(self, session_table_version: SessionTableVersion): {"regex": "thing_a", "alias": "thing_b"}, {"regex": "thing_b", "alias": "thing_c"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -308,8 +288,7 @@ def test_path_filters(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate_one_user(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate_one_user(self): self._create_pageviews( "p1", [ @@ -325,7 +304,6 @@ def test_scroll_depth_bounce_rate_one_user(self, session_table_version: SessionT breakdown_by=WebStatsBreakdown.PAGE, include_scroll_depth=True, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -337,8 +315,7 @@ def test_scroll_depth_bounce_rate_one_user(self, session_table_version: SessionT results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate(self): self._create_pageviews( "p1", [ @@ -369,7 +346,6 @@ def test_scroll_depth_bounce_rate(self, session_table_version: SessionTableVersi breakdown_by=WebStatsBreakdown.PAGE, include_scroll_depth=True, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -381,8 +357,7 @@ def test_scroll_depth_bounce_rate(self, session_table_version: SessionTableVersi results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate_with_filter(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate_with_filter(self): self._create_pageviews( "p1", [ @@ -414,7 +389,6 @@ def test_scroll_depth_bounce_rate_with_filter(self, session_table_version: Sessi include_scroll_depth=True, include_bounce_rate=True, properties=[EventPropertyFilter(key="$pathname", operator=PropertyOperator.EXACT, value="/a")], - session_table_version=session_table_version, ).results self.assertEqual( @@ -424,8 +398,7 @@ def test_scroll_depth_bounce_rate_with_filter(self, session_table_version: Sessi results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_scroll_depth_bounce_rate_path_cleaning(self, session_table_version: SessionTableVersion): + def test_scroll_depth_bounce_rate_path_cleaning(self): self._create_pageviews( "p1", [ @@ -446,7 +419,6 @@ def test_scroll_depth_bounce_rate_path_cleaning(self, session_table_version: Ses {"regex": "\\/b\\/\\d+", "alias": "/b/:id"}, {"regex": "\\/c\\/\\d+", "alias": "/c/:id"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -458,8 +430,7 @@ def test_scroll_depth_bounce_rate_path_cleaning(self, session_table_version: Ses results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate_one_user(self, session_table_version: SessionTableVersion): + def test_bounce_rate_one_user(self): self._create_pageviews( "p1", [ @@ -474,7 +445,6 @@ def test_bounce_rate_one_user(self, session_table_version: SessionTableVersion): "2023-12-15", breakdown_by=WebStatsBreakdown.PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -486,8 +456,7 @@ def test_bounce_rate_one_user(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate(self, session_table_version: SessionTableVersion): + def test_bounce_rate(self): self._create_pageviews( "p1", [ @@ -517,7 +486,6 @@ def test_bounce_rate(self, session_table_version: SessionTableVersion): "2023-12-15", breakdown_by=WebStatsBreakdown.PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -529,8 +497,7 @@ def test_bounce_rate(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate_with_property(self, session_table_version: SessionTableVersion): + def test_bounce_rate_with_property(self): self._create_pageviews( "p1", [ @@ -561,7 +528,6 @@ def test_bounce_rate_with_property(self, session_table_version: SessionTableVers breakdown_by=WebStatsBreakdown.PAGE, include_bounce_rate=True, properties=[EventPropertyFilter(key="$pathname", operator=PropertyOperator.EXACT, value="/a")], - session_table_version=session_table_version, ).results self.assertEqual( @@ -571,8 +537,7 @@ def test_bounce_rate_with_property(self, session_table_version: SessionTableVers results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_bounce_rate_path_cleaning(self, session_table_version: SessionTableVersion): + def test_bounce_rate_path_cleaning(self): self._create_pageviews( "p1", [ @@ -592,7 +557,6 @@ def test_bounce_rate_path_cleaning(self, session_table_version: SessionTableVers {"regex": "\\/b\\/\\d+", "alias": "/b/:id"}, {"regex": "\\/c\\/\\d+", "alias": "/c/:id"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -604,8 +568,7 @@ def test_bounce_rate_path_cleaning(self, session_table_version: SessionTableVers results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate_one_user(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate_one_user(self): self._create_pageviews( "p1", [ @@ -620,7 +583,6 @@ def test_entry_bounce_rate_one_user(self, session_table_version: SessionTableVer "2023-12-15", breakdown_by=WebStatsBreakdown.INITIAL_PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -630,8 +592,7 @@ def test_entry_bounce_rate_one_user(self, session_table_version: SessionTableVer results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate(self): self._create_pageviews( "p1", [ @@ -661,7 +622,6 @@ def test_entry_bounce_rate(self, session_table_version: SessionTableVersion): "2023-12-15", breakdown_by=WebStatsBreakdown.INITIAL_PAGE, include_bounce_rate=True, - session_table_version=session_table_version, ).results self.assertEqual( @@ -671,8 +631,7 @@ def test_entry_bounce_rate(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate_with_property(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate_with_property(self): self._create_pageviews( "p1", [ @@ -703,7 +662,6 @@ def test_entry_bounce_rate_with_property(self, session_table_version: SessionTab breakdown_by=WebStatsBreakdown.INITIAL_PAGE, include_bounce_rate=True, properties=[EventPropertyFilter(key="$pathname", operator=PropertyOperator.EXACT, value="/a")], - session_table_version=session_table_version, ).results self.assertEqual( @@ -713,8 +671,7 @@ def test_entry_bounce_rate_with_property(self, session_table_version: SessionTab results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_entry_bounce_rate_path_cleaning(self, session_table_version: SessionTableVersion): + def test_entry_bounce_rate_path_cleaning(self): self._create_pageviews( "p1", [ @@ -734,7 +691,6 @@ def test_entry_bounce_rate_path_cleaning(self, session_table_version: SessionTab {"regex": "\\/b\\/\\d+", "alias": "/b/:id"}, {"regex": "\\/c\\/\\d+", "alias": "/c/:id"}, ], - session_table_version=session_table_version, ).results self.assertEqual( @@ -744,8 +700,7 @@ def test_entry_bounce_rate_path_cleaning(self, session_table_version: SessionTab results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_source_medium_campaign(self, session_table_version: SessionTableVersion): + def test_source_medium_campaign(self): d1 = "d1" s1 = str(uuid7("2024-06-26")) @@ -785,7 +740,6 @@ def test_source_medium_campaign(self, session_table_version: SessionTableVersion "all", "2024-06-27", breakdown_by=WebStatsBreakdown.INITIAL_UTM_SOURCE_MEDIUM_CAMPAIGN, - session_table_version=session_table_version, ).results self.assertEqual( @@ -793,8 +747,7 @@ def test_source_medium_campaign(self, session_table_version: SessionTableVersion results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_null_in_utm_tags(self, session_table_version: SessionTableVersion): + def test_null_in_utm_tags(self): d1 = "d1" s1 = str(uuid7("2024-06-26")) @@ -836,7 +789,6 @@ def test_null_in_utm_tags(self, session_table_version: SessionTableVersion): "all", "2024-06-27", breakdown_by=WebStatsBreakdown.INITIAL_UTM_SOURCE, - session_table_version=session_table_version, ).results self.assertEqual( @@ -844,8 +796,7 @@ def test_null_in_utm_tags(self, session_table_version: SessionTableVersion): results, ) - @parameterized.expand([[SessionTableVersion.V1], [SessionTableVersion.V2]]) - def test_is_not_set_filter(self, session_table_version: SessionTableVersion): + def test_is_not_set_filter(self): d1 = "d1" s1 = str(uuid7("2024-06-26")) @@ -888,7 +839,6 @@ def test_is_not_set_filter(self, session_table_version: SessionTableVersion): "2024-06-27", breakdown_by=WebStatsBreakdown.INITIAL_UTM_SOURCE, properties=[EventPropertyFilter(key="utm_source", operator=PropertyOperator.IS_NOT_SET)], - session_table_version=session_table_version, ).results self.assertEqual( diff --git a/posthog/hogql_queries/web_analytics/top_clicks.py b/posthog/hogql_queries/web_analytics/top_clicks.py index c2324e7ec10f9..38c4e35dacd42 100644 --- a/posthog/hogql_queries/web_analytics/top_clicks.py +++ b/posthog/hogql_queries/web_analytics/top_clicks.py @@ -16,7 +16,7 @@ class WebTopClicksQueryRunner(WebAnalyticsQueryRunner): response: WebTopClicksQueryResponse cached_response: CachedWebTopClicksQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("top_clicks_query"): top_sources_query = parse_select( """ diff --git a/posthog/hogql_queries/web_analytics/web_goals.py b/posthog/hogql_queries/web_analytics/web_goals.py index 2b14c6236f6f8..0d03b8b0a64b4 100644 --- a/posthog/hogql_queries/web_analytics/web_goals.py +++ b/posthog/hogql_queries/web_analytics/web_goals.py @@ -24,7 +24,7 @@ class WebGoalsQueryRunner(WebAnalyticsQueryRunner): response: WebGoalsQueryResponse cached_response: CachedWebGoalsQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: with self.timings.measure("date_expr"): start = self.query_date_range.date_from_as_hogql() end = self.query_date_range.date_to_as_hogql() diff --git a/posthog/hogql_queries/web_analytics/web_overview.py b/posthog/hogql_queries/web_analytics/web_overview.py index 022f918e0913e..6e7e3ac7d6bd5 100644 --- a/posthog/hogql_queries/web_analytics/web_overview.py +++ b/posthog/hogql_queries/web_analytics/web_overview.py @@ -28,7 +28,7 @@ class WebOverviewQueryRunner(WebAnalyticsQueryRunner): response: WebOverviewQueryResponse cached_response: CachedWebOverviewQueryResponse - def to_query(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def to_query(self) -> ast.SelectQuery | ast.SelectSetQuery: return self.outer_select def calculate(self): diff --git a/posthog/kafka_client/topics.py b/posthog/kafka_client/topics.py index 227ca18d666fc..fa58d40c5fa36 100644 --- a/posthog/kafka_client/topics.py +++ b/posthog/kafka_client/topics.py @@ -23,8 +23,6 @@ KAFKA_CLICKHOUSE_HEATMAP_EVENTS = f"{KAFKA_PREFIX}clickhouse_heatmap_events{SUFFIX}" -KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = f"{KAFKA_PREFIX}exception_symbolification_events{SUFFIX}" - # from capture to recordings consumer KAFKA_SESSION_RECORDING_EVENTS = f"{KAFKA_PREFIX}session_recording_events{SUFFIX}" # from capture to recordings blob ingestion consumer @@ -34,3 +32,6 @@ # from recordings consumer to clickhouse KAFKA_CLICKHOUSE_SESSION_REPLAY_EVENTS = f"{KAFKA_PREFIX}clickhouse_session_replay_events{SUFFIX}" KAFKA_CLICKHOUSE_SESSION_RECORDING_EVENTS = f"{KAFKA_PREFIX}clickhouse_session_recording_events{SUFFIX}" + +KAFKA_EXCEPTION_SYMBOLIFICATION_EVENTS = f"{KAFKA_PREFIX}exception_symbolification_events{SUFFIX}" +KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT = f"{KAFKA_PREFIX}clickhouse_error_tracking_issue_fingerprint{SUFFIX}" diff --git a/posthog/models/cohort/util.py b/posthog/models/cohort/util.py index 1d18d632bd030..6d8de53b0e8de 100644 --- a/posthog/models/cohort/util.py +++ b/posthog/models/cohort/util.py @@ -7,6 +7,8 @@ from django.conf import settings from django.utils import timezone from rest_framework.exceptions import ValidationError + +from posthog.hogql.resolver_utils import extract_select_queries from posthog.queries.util import PersonPropertiesMode from posthog.clickhouse.client.connection import Workload from posthog.clickhouse.query_tagging import tag_queries @@ -83,8 +85,7 @@ def print_cohort_hogql_query(cohort: Cohort, hogql_context: HogQLContext) -> str cast(dict, cohort.query), team=cast(Team, cohort.team), limit_context=LimitContext.COHORT_CALCULATION ).to_query() - select_queries: list[ast.SelectQuery] = [query] if isinstance(query, ast.SelectQuery) else query.select_queries - for select_query in select_queries: + for select_query in extract_select_queries(query): columns: dict[str, ast.Expr] = {} for expr in select_query.select: if isinstance(expr, ast.Alias): diff --git a/posthog/models/error_tracking/sql.py b/posthog/models/error_tracking/sql.py new file mode 100644 index 0000000000000..1700a6c7c4cd9 --- /dev/null +++ b/posthog/models/error_tracking/sql.py @@ -0,0 +1,79 @@ +from posthog.clickhouse.indexes import index_by_kafka_timestamp +from posthog.clickhouse.kafka_engine import KAFKA_COLUMNS_WITH_PARTITION, kafka_engine +from posthog.clickhouse.table_engines import ReplacingMergeTree +from posthog.kafka_client.topics import KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT +from posthog.settings import CLICKHOUSE_CLUSTER, CLICKHOUSE_DATABASE + +# +# error_tracking_issue_fingerprint_overrides: This table contains rows for all (team_id, fingerprint) +# pairs where the $exception_issue_id has changed. +# + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE = "error_tracking_issue_fingerprint_overrides" + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_BASE_SQL = """ +CREATE TABLE IF NOT EXISTS {table_name} ON CLUSTER '{cluster}' +( + team_id Int64, + fingerprint VARCHAR, + issue_id UUID, + is_deleted Int8, + version Int64 + {extra_fields} +) ENGINE = {engine} +""" + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_ENGINE = lambda: ReplacingMergeTree( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, ver="version" +) + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = lambda: ( + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_BASE_SQL + + """ + ORDER BY (team_id, fingerprint) + SETTINGS index_granularity = 512 + """ +).format( + table_name=ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, + cluster=CLICKHOUSE_CLUSTER, + engine=ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_ENGINE(), + extra_fields=f""" + {KAFKA_COLUMNS_WITH_PARTITION} + , {index_by_kafka_timestamp(ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE)} + """, +) + +KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = ( + lambda: ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_BASE_SQL.format( + table_name="kafka_" + ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, + cluster=CLICKHOUSE_CLUSTER, + engine=kafka_engine( + KAFKA_ERROR_TRACKING_ISSUE_FINGERPRINT, group="clickhouse-error-tracking-issue-fingerprint-overrides" + ), + extra_fields="", + ) +) + +ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_MV_SQL = """ +CREATE MATERIALIZED VIEW IF NOT EXISTS {table_name}_mv ON CLUSTER '{cluster}' +TO {database}.{table_name} +AS SELECT +team_id, +fingerprint, +issue_id, +is_deleted, +version, +_timestamp, +_offset, +_partition +FROM {database}.kafka_{table_name} +WHERE version > 0 -- only store updated rows, not newly inserted ones +""".format( + table_name=ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE, + cluster=CLICKHOUSE_CLUSTER, + database=CLICKHOUSE_DATABASE, +) + +TRUNCATE_ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE_SQL = ( + f"TRUNCATE TABLE IF EXISTS {ERROR_TRACKING_ISSUE_FINGERPRINT_OVERRIDES_TABLE} ON CLUSTER '{CLICKHOUSE_CLUSTER}'" +) diff --git a/posthog/models/feature_flag/permissions.py b/posthog/models/feature_flag/permissions.py index 8f766b4fccc60..d2b0bb858a403 100644 --- a/posthog/models/feature_flag/permissions.py +++ b/posthog/models/feature_flag/permissions.py @@ -6,7 +6,7 @@ def can_user_edit_feature_flag(request, feature_flag): # self hosted check for enterprise models that may not exist try: from ee.models.feature_flag_role_access import FeatureFlagRoleAccess - from ee.models.organization_resource_access import OrganizationResourceAccess + from ee.models.rbac.organization_resource_access import OrganizationResourceAccess except: return True else: diff --git a/posthog/models/personal_api_key.py b/posthog/models/personal_api_key.py index ea886b55757c6..cac5adefbc65d 100644 --- a/posthog/models/personal_api_key.py +++ b/posthog/models/personal_api_key.py @@ -1,4 +1,4 @@ -from typing import Optional, Literal, get_args +from typing import Optional, Literal import hashlib from django.contrib.auth.hashers import PBKDF2PasswordHasher @@ -66,56 +66,3 @@ class PersonalAPIKey(models.Model): null=True, blank=True, ) - - -## API Scopes -# These are the scopes that are used to define the permissions of the API tokens. -# Not every model needs a scope - it should more be for top-level things -# Typically each object should have `read` and `write` scopes, but some objects may have more specific scopes - -# WARNING: Make sure to keep in sync with the frontend! -APIScopeObject = Literal[ - "action", - "activity_log", - "annotation", - "batch_export", - "cohort", - "dashboard", - "dashboard_template", - "early_access_feature", - "event_definition", - "experiment", - "export", - "feature_flag", - "group", - "insight", - "query", # Covers query and events endpoints - "notebook", - "organization", - "organization_member", - "person", - "plugin", - "project", - "property_definition", - "session_recording", - "session_recording_playlist", - "sharing_configuration", - "subscription", - "survey", - "user", - "webhook", -] - -APIScopeActions = Literal[ - "read", - "write", -] - -APIScopeObjectOrNotSupported = Literal[ - APIScopeObject, - "INTERNAL", -] - - -API_SCOPE_OBJECTS: tuple[APIScopeObject, ...] = get_args(APIScopeObject) -API_SCOPE_ACTIONS: tuple[APIScopeActions, ...] = get_args(APIScopeActions) diff --git a/posthog/models/scopes.py b/posthog/models/scopes.py new file mode 100644 index 0000000000000..2bd0d48b405e5 --- /dev/null +++ b/posthog/models/scopes.py @@ -0,0 +1,60 @@ +## API Scopes +# These are the scopes that are used to define the permissions of the API tokens. +# Not every model needs a scope - it should more be for top-level things +# Typically each object should have `read` and `write` scopes, but some objects may have more specific scopes + +# WARNING: Make sure to keep in sync with the frontend! +from typing import Literal, get_args + + +## API Scopes +# These are the scopes that are used to define the permissions of the API tokens. +# Not every model needs a scope - it should more be for top-level things +# Typically each object should have `read` and `write` scopes, but some objects may have more specific scopes + +# WARNING: Make sure to keep in sync with the frontend! +APIScopeObject = Literal[ + "action", + "activity_log", + "annotation", + "batch_export", + "cohort", + "dashboard", + "dashboard_template", + "early_access_feature", + "event_definition", + "experiment", + "export", + "feature_flag", + "group", + "insight", + "query", # Covers query and events endpoints + "notebook", + "organization", + "organization_member", + "person", + "plugin", + "project", + "property_definition", + "session_recording", + "session_recording_playlist", + "sharing_configuration", + "subscription", + "survey", + "user", + "webhook", +] + +APIScopeActions = Literal[ + "read", + "write", +] + +APIScopeObjectOrNotSupported = Literal[ + APIScopeObject, + "INTERNAL", +] + + +API_SCOPE_OBJECTS: tuple[APIScopeObject, ...] = get_args(APIScopeObject) +API_SCOPE_ACTIONS: tuple[APIScopeActions, ...] = get_args(APIScopeActions) diff --git a/posthog/models/sessions/sql.py b/posthog/models/sessions/sql.py index 680e1f7ff6f7b..93d3083a37763 100644 --- a/posthog/models/sessions/sql.py +++ b/posthog/models/sessions/sql.py @@ -7,6 +7,7 @@ AggregatingMergeTree, ) +# V1 Sessions table TABLE_BASE_NAME = "sessions" SESSIONS_DATA_TABLE = lambda: f"sharded_{TABLE_BASE_NAME}" @@ -21,6 +22,32 @@ ) DROP_SESSION_VIEW_SQL = lambda: f"DROP VIEW IF EXISTS {TABLE_BASE_NAME}_v ON CLUSTER '{settings.CLICKHOUSE_CLUSTER}'" +# Only teams that were grandfathered into the V1 sessions table are allowed to use it. Everyone else should use V2, +# i.e. raw_sessions. These teams were those who were seen to have changed their session table version in these metabase +# queries: +# US: https://metabase.prod-us.posthog.dev/question#eyJkYXRhc2V0X3F1ZXJ5Ijp7InR5cGUiOiJuYXRpdmUiLCJuYXRpdmUiOnsicXVlcnkiOiJTRUxFQ1QgdGVhbV9pZCwgc1xuRlJPTSAoXG4gICAgU0VMRUNUIG1vZGlmaWVycy0-PidzZXNzaW9uVGFibGVWZXJzaW9uJyBBUyBzLCBpZCBhcyB0ZWFtX2lkXG4gICAgRlJPTSBwb3N0aG9nX3RlYW1cbikgc3ViXG5XSEVSRSBzICE9ICcnIiwidGVtcGxhdGUtdGFncyI6e319LCJkYXRhYmFzZSI6MzR9LCJkaXNwbGF5IjoidGFibGUiLCJwYXJhbWV0ZXJzIjpbXSwidmlzdWFsaXphdGlvbl9zZXR0aW5ncyI6e319 +# EU: https://metabase.prod-eu.posthog.dev/question#eyJkYXRhc2V0X3F1ZXJ5Ijp7InR5cGUiOiJuYXRpdmUiLCJuYXRpdmUiOnsicXVlcnkiOiJTRUxFQ1QgdGVhbV9pZCwgc1xuRlJPTSAoXG4gICAgU0VMRUNUIG1vZGlmaWVycy0-PidzZXNzaW9uVGFibGVWZXJzaW9uJyBBUyBzLCBpZCBhcyB0ZWFtX2lkXG4gICAgRlJPTSBwb3N0aG9nX3RlYW1cbikgc3ViXG5XSEVSRSBzICE9ICcnIiwidGVtcGxhdGUtdGFncyI6e319LCJkYXRhYmFzZSI6MzR9LCJkaXNwbGF5IjoidGFibGUiLCJwYXJhbWV0ZXJzIjpbXSwidmlzdWFsaXphdGlvbl9zZXR0aW5ncyI6e319 +# or had contacted support about an issue. +# This list exists because we want to reduce the number of writes happening to this table, and so we don't write to it +# for any team not in this list. Adding a team to this is possible if needed, but would require changing this MV in +# production and backfilling this table with the management command backfill_sessions_table. +ALLOWED_TEAM_IDS = [ + # posthog + 1, + 2, + # US query + 13610, # zendesk: https://posthoghelp.zendesk.com/agent/tickets/18001 + 19279, + 21173, + 29929, + 32050, + # EU query + 9910, + 11775, + 21129, + 31490, +] +ALLOWED_TEAM_IDS_SQL = ", ".join(str(team_id) for team_id in ALLOWED_TEAM_IDS) # if updating these column definitions # you'll need to update the explicit column definitions in the materialized view creation statement below @@ -144,7 +171,7 @@ def source_column(column_name: str) -> str: sumIf(1, event='$autocapture') as autocapture_count FROM {database}.sharded_events -WHERE `$session_id` IS NOT NULL AND `$session_id` != '' +WHERE `$session_id` IS NOT NULL AND `$session_id` != '' AND team_id IN ({allowed_team_ids}) GROUP BY `$session_id`, team_id """.format( database=settings.CLICKHOUSE_DATABASE, @@ -168,6 +195,7 @@ def source_column(column_name: str) -> str: mc_cid_property=source_column("mc_cid"), igshid_property=source_column("igshid"), ttclid_property=source_column("ttclid"), + allowed_team_ids=ALLOWED_TEAM_IDS_SQL, ) ) diff --git a/posthog/permissions.py b/posthog/permissions.py index 889832c13baa7..6de160e099567 100644 --- a/posthog/permissions.py +++ b/posthog/permissions.py @@ -19,7 +19,7 @@ from posthog.cloud_utils import is_cloud from posthog.exceptions import EnterpriseFeatureException from posthog.models import Organization, OrganizationMembership, Team, User -from posthog.models.personal_api_key import APIScopeObjectOrNotSupported +from posthog.models.scopes import APIScopeObjectOrNotSupported from posthog.utils import get_can_create_org CREATE_METHODS = ["POST", "PUT"] diff --git a/posthog/session_recordings/queries/session_recording_list_from_filters.py b/posthog/session_recordings/queries/session_recording_list_from_filters.py index 26649ef7165e3..46fb0664c56b7 100644 --- a/posthog/session_recordings/queries/session_recording_list_from_filters.py +++ b/posthog/session_recordings/queries/session_recording_list_from_filters.py @@ -328,7 +328,7 @@ def __init__(self, team: Team, filter: SessionRecordingsFilter, ttl_days: int): self._filter = filter self._ttl_days = ttl_days - def get_query(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query(self) -> ast.SelectQuery | ast.SelectSetQuery | None: if self.person_properties and not poe_is_active(self._team): return parse_select( """ @@ -383,7 +383,7 @@ def __init__(self, team: Team, filter: SessionRecordingsFilter, ttl_days: int): self._filter = filter self._ttl_days = ttl_days - def get_query(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query(self) -> ast.SelectQuery | ast.SelectSetQuery | None: if self.cohort_properties: return parse_select( self.raw_cohort_to_distinct_id, @@ -433,7 +433,7 @@ def get_operation(self) -> CompareOperation | None: right=q, ) - def get_query(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query(self) -> ast.SelectQuery | ast.SelectSetQuery | None: if not self._filter.person_uuid: return None @@ -529,14 +529,14 @@ def _select_from_events(self, select_expr: ast.Expr) -> ast.SelectQuery: group_by=[ast.Field(chain=["$session_id"])], ) - def get_query_for_session_id_matching(self) -> ast.SelectQuery | ast.SelectUnionQuery | None: + def get_query_for_session_id_matching(self) -> ast.SelectQuery | ast.SelectSetQuery | None: use_poe = poe_is_active(self._team) and self.person_properties if self._filter.entities or self.event_properties or self.group_properties or use_poe: return self._select_from_events(ast.Alias(alias="session_id", expr=ast.Field(chain=["$session_id"]))) else: return None - def get_query_for_event_id_matching(self) -> ast.SelectQuery | ast.SelectUnionQuery: + def get_query_for_event_id_matching(self) -> ast.SelectQuery | ast.SelectSetQuery: return self._select_from_events(ast.Call(name="groupUniqArray", args=[ast.Field(chain=["uuid"])])) def get_event_ids_for_session(self) -> SessionRecordingQueryResult: diff --git a/posthog/warehouse/models/modeling.py b/posthog/warehouse/models/modeling.py index 3cc6272c3685f..9e7dcefa4c0a3 100644 --- a/posthog/warehouse/models/modeling.py +++ b/posthog/warehouse/models/modeling.py @@ -10,6 +10,7 @@ from posthog.hogql import ast from posthog.hogql.database.database import Database, create_hogql_database from posthog.hogql.parser import parse_select +from posthog.hogql.resolver_utils import extract_select_queries from posthog.models.team import Team from posthog.models.user import User from posthog.models.utils import ( @@ -99,8 +100,8 @@ def get_parents_from_model_query(model_query: str) -> set[str]: hogql_query = parse_select(model_query) - if isinstance(hogql_query, ast.SelectUnionQuery): - queries = hogql_query.select_queries + if isinstance(hogql_query, ast.SelectSetQuery): + queries = list(extract_select_queries(hogql_query)) else: queries = [hogql_query] @@ -114,8 +115,8 @@ def get_parents_from_model_query(model_query: str) -> set[str]: for name, cte in query.ctes.items(): ctes.add(name) - if isinstance(cte.expr, ast.SelectUnionQuery): - queries.extend(cte.expr.select_queries) + if isinstance(cte.expr, ast.SelectSetQuery): + queries.extend(list(extract_select_queries(cte.expr))) elif isinstance(cte.expr, ast.SelectQuery): queries.append(cte.expr) @@ -130,8 +131,8 @@ def get_parents_from_model_query(model_query: str) -> set[str]: continue queries.append(join.table) - elif isinstance(join.table, ast.SelectUnionQuery): - queries.extend(join.table.select_queries) + elif isinstance(join.table, ast.SelectSetQuery): + queries.extend(list(extract_select_queries(join.table))) while join is not None: parent_name = join.table.chain[0] # type: ignore diff --git a/requirements.in b/requirements.in index 619c6a06cdaaf..b0e87e51b2175 100644 --- a/requirements.in +++ b/requirements.in @@ -105,7 +105,7 @@ phonenumberslite==8.13.6 openai==1.51.2 tiktoken==0.8.0 nh3==0.2.14 -hogql-parser==1.0.45 +hogql-parser==1.0.46 zxcvbn==4.4.28 zstd==1.5.5.1 xmlsec==1.3.13 # Do not change this version - it will break SAML diff --git a/requirements.txt b/requirements.txt index 82798318498ef..ef080dcdeef7c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -282,7 +282,7 @@ h11==0.13.0 # wsproto hexbytes==1.0.0 # via dlt -hogql-parser==1.0.45 +hogql-parser==1.0.46 # via -r requirements.in httpcore==1.0.2 # via httpx